{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分类训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 机器学习的Hello World,一个新的分类算法，都会看看在MINIST上面的执行结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i',2)   #高位字节，将数字2打包成一个二进制数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open('./MNIST_data/train-images-idx3-ubyte','rb') as f:\n",
    "    buffer = f.read(4*4)   #4个int\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    length = head[1] * head[2] * head[3]\n",
    "    print(length)\n",
    "    buffer = f.read(length)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)  # B代表字节"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data,(head[1],head[2],head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i],cmap = 'gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\feature_extraction\\text.py:17: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working\n",
      "  from collections import Mapping, defaultdict\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original',data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * DESCR 数据集描述\n",
    "   * data包含一个数组，每个实例为一行，每个特征为一列\n",
    "   * target 包含一个带有标签的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X,y = mnist['data'],mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]    #下标\n",
    "some_digit_image = some_digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image,cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建立测试集与训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train,X_test,y_train,y_test = X[:60000],X[60000:],y[:60000],y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([55702, 51011,  6583, ..., 27474, 14009, 48442])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集数据分布均匀，有些机器学习算法对训练实例的顺序敏感\n",
    "import numpy as np \n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train,y_train = X_train[shuffle_index],y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 识别数字5，二元分类5或者非5\n",
    "# 创建目标向量\n",
    "y_train_5 = (y_train == 5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False,  True],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [ True, False, False, ..., False, False,  True],\n",
       "       [False, False, False, ..., False, False, False]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test ==5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD梯度下降 分类器， 适合非常大的数据集，独立处理训练集数据，一次一个，适合在线学习\n",
    "from sklearn .linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42)\n",
    "sgd_clf.fit(X_train,y_train_5)\n",
    "\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 性能考核"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.96985, 0.9638 , 0.9644 ])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估分类器比评估回归器要困难的多\n",
    "\n",
    "# 5个折叠，正确率达到95%以上\n",
    "\n",
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf,X_train,y_train_5,cv=3,scoring=\"accuracy\")    # 交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把每张图都分类成 非5\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):   # 估算器\n",
    "    def fit(self,X,y=None):\n",
    "        pass\n",
    "    def predict(self,X):\n",
    "        return np.zeros((len(X),1),dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((len(X),1),dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.90705, 0.9085 , 0.9134 ])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf,X_train,y_train_5,cv=3,scoring=\"accuracy\")  #死数据达到90%以上精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 准确率超过90%，因为5的图像大约只有10%，你猜一张图不是5，90%都是正确的\n",
    "   * 这说明准确率无法成为分类器的首要性能指标，特别是当你处理偏科数据集，某些类比其他类更频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 评估分类器性能的最好办法时混淆矩阵\n",
    "# A类别实例被分为B类别次数\n",
    "# 想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与cross_val_score相比\n",
    "  * 同样执行交叉验证\n",
    "  * 返回的不是评估分数，是每个折叠的预测\n",
    "  * 每一个实例在模型预测时间使用的数据，在训练期间从未停过"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53974,   605],\n",
       "       [ 1434,  3987]], dtype=int64)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 行表示实际类别，列表示预测类别\n",
    "# 第一行 第一列 53272 被正确的分为 非5，真负类\n",
    "# 第一行 第二列 1307 被错误的分类成5 假正类\n",
    "# 第二行 第一列1077 被错误的分为非5 假负类\n",
    "# 第二行 第二列4344 被正确的分在了5， 真正类\n",
    "# 这种衡量方式太复杂，我们可以用更简单的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5,y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正类预测的准确率 被称为分类器的精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 精度 = TP/(TP+FP)\n",
    "    TP是真正类的数量，FP是假正类的数量\n",
    "       \n",
    "### 召回率TPR = TP/(TP+FN)（灵敏度）\n",
    "    * 检测正类实例的比例 FN是假负类的数量\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 精度与召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8682491289198606"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score,recall_score\n",
    "\n",
    "precision_score(y_train_5,y_train_pred)   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7354731599335916"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 说明 检测一张图的时候，只有65%的概率是准确的，而且只有85%的数字5，被它检测出来\n",
    "# 精度与召回率合成单一指标，成为F1分数，谐波平均值\n",
    "# 平均值平等对待所有值，谐波平均值会给予较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "F1 = 2/(1/precision+1/recall) = 2*(precision*recall)/precision+recall) = TP/(TP+(FN+FP)/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7963647258563868"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# F1分数对那些具有相似精度和召回率 分类器更有利，这不一定符合你的期望\n",
    "# 有时候你更关心精度，有时你更关心召回率\n",
    "# 训练一个分类器检测儿童可以放心观看的视频，你可能要求拦截了很多好的视频，低召回率，保留下来的全是安全的视频，高精度\n",
    "# 不能同时增加精度并减少召回率，反之亦然"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度，召回率权衡"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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z91jlp+XW3wayy//366Z95AImV5HkWO05E0R216bXXL4NrSjJSYvB8JH3lZC7V/IOTFFeSBe8e4pb8mOyd+Q8h1SjopNnPRxqWPoRNrUEL+sjnDtvtK6dPD15ptvbjbZZJPm3HPPbX72s581f/3rX5s111wz1YHbbrut+fWvf92cdtppMyZvuOGGZocddkj/AO22227NW9/61vQvF4MT/q3585//nHK2aU/6F4uBy5577tl885vfbH74wx82D37wg9OFG//ufOMb32iOOOKI5Ac6Z599dhqcHHzwwc3Xv/71dMfi1ltvbY488sjmjjvuSPYvvPDCZrXVVhtUv2eCCa7Y+hBUnXpxYlO9GMPZaF87pn/wwOLFlPwYvA3FoB0Oqb+qE97ykvxQP7163rLx2ivJRbhT3SnZnKvj+KZlrmy22VHZknvrQ5sd7z4GE+AI16s3VC5SxkMxxq4b+Dl4QDE0yKpXGagMLJsM0GHTkT7nOc9pvvKVrzS77rprs/rqqycyli5d2rzqVa+adSHCRfxFF13UnHLKKen2NQMHLvo/8IEPNCussEIakDA4+de//pXkLr744ubDH/5wc+KJJzbrrLNOw/a1117bHH744c15553X7LLLLs0f/vCHNEjAD04i+MEdDXx6+9vfno4deOCBzSc+8Yk0WOORqLEGlctmrZi/qMe6OJi/CKrlykBloDKwcBgY9MjTwglvOj2tJ7rpLJfcq1pOOSOTbcMnj5AxAHjpS1+a7h5wsX7nnXemgQQDDi7ylRgQPOABD2j22muvZu+9924233zzhjsZxx13XHP88cenAciZZ57ZrLLKKumfJfS5C8FzrR/96EebTTfdND1i9ZCHPKRZccUVm7vuukumU46dn/zkJ80DH/jAZBf5T3/6080jH/nI9DjVNtts01xyySWj/EM2y7G6MYuBoe3Q1qVZButGZWARMTC0fSwECsa4G7IQeFgoPtYBxUIpqepnZWCBM5APGN74xjemuwJc+PGeRZ7WX3/9hnccuNuwxx57pEeiOHkyAYBeUuOuBfrs5+TDAOU73/lOujtxwgknNOecc056/Ik7E7rARPbyyy9PA5r99tsvDUDQZaBzxhlnNKeeemrz4x//uPn73/+eu1S3KwOVgcpAZaAyUBloYWDUR544aS+2pBF05F8CXdhEuMC+LpoiWBGMSWTH9Elc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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * SGDClassifier对每个实例基于决策函数计算一个分值，大于阀值为正类，否则为负类\n",
    "   * 中间阀值右侧找到四个真正类，真5，一个假正类6，精度为80%\n",
    "   * 在所有的6个真正的5中分类器找到了4个，召回率为67%\n",
    "   * 提高阀值，向右移动，提高精度，找回降低\n",
    "   * 反之阀值降低，提高召回，精度降低\n",
    "   * sklearn不可以直接设置阀值，可以访问决策分数\n",
    "   * SGDClassifier默认阀值为0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如何设置阀值\n",
    "\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下，以LogisticRegression为例\n",
    "# clf = LogisticRegression()\n",
    "# clf.fit（X_train,y_train)\n",
    "# pred_proba = clf.predict_proba(X_test)[:,1]\n",
    "# threshold = 0.75   # 阀值设置为0.75\n",
    "# pred_label = pred_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阀值是0.75\n",
    "# pred_label里True就是概率大于0.75的\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-31354.9014713])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 提高阀值可以降低召回率，提高阀值到200000，就错了这个图\n",
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 返回决策分数，而不是预测结果\n",
    "y_scores = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3,\n",
    "                            method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有了y_scores， 可以计算出所有可能的阀值的精度和召回率\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions,recalls,thresholds = precision_recall_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# matplotlib绘制精度和召回率相对于阀值的函数图\n",
    "def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):\n",
    "    plt.plot(thresholds,precisions[:-1],\"b--\",label=\"Precision\",linewidth=2)\n",
    "    plt.plot(thresholds,recalls[:-1],\"g--\",label=\"Recall\",linewidth=2)\n",
    "    plt.xlabel(\"Threshold\",fontsize=16)\n",
    "    plt.legend(loc=\"upper left\",fontsize=16)\n",
    "    plt.ylim([0,1])\n",
    "    \n",
    "plt.figure(figsize=(8,4))\n",
    "plot_precision_recall_vs_threshold(precisions,recalls,thresholds)\n",
    "plt.xlim([-700000,700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 目标设定为90%的精度，阀值大概在240000左右,设置了阀值为240000\n",
    "y_train_pred_90 = (y_scores > 240000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9806451612903225"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5,y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.30843017893377606"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 获得一个90%精度的分类器，但如果召回太低，精度再高，也不怎么有用\n",
    "   * 如果工作中，需要99%的精度，你应该回应，召回率是多少"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions,recalls):\n",
    "    plt.plot(recalls,precisions,\"b-\",linewidth=2)\n",
    "    plt.xlabel(\"召回\",fontsize=16)\n",
    "    plt.ylabel(\"精度\",fontsize=16)\n",
    "    plt.axis([0,1,0,1])\n",
    "    \n",
    "plt.figure(figsize=(8,6))\n",
    "plot_precision_vs_recall(precisions,recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 本质是 真正类率tpr和假正类率fpr （错误的分为正类的负类实例比例）\n",
    "# 与召回/精度曲线非常相似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "fpr,tpr,thresholds = roc_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mTFjBmlpaaxYsYJffvnF6ZIkzLkm9LMLAuvuawleEakOMjMzGTZsGGPHjqVnz55kZGTQvXt3p8uSMOea0E/fsAeAuChdoy8izpswYQL//e9/uf/++1mwYAGNGjVyuiQRF83ezw2M5cdEKvRFxBl+v5/MzEySk5O57777GDNmDD179nS6LJH9XBP6KYnRZBeWaAleEXHEtm3bGDVqFHl5eXz88cekpKSQkqJLiKV6cU33/rpduQDUidcOeyISWh988AGpqan7F9vxetXjKNWTa0K/VHy0azovRKSaKyoqYsKECQwcOJD69euTnp7ONddco6V0pdpyRejnF/n2305U6ItIiBQWFjJv3jyuvfZavvrqK9q3b+90SSJH5IqE3HvAevv6hC0iVe2tt96if//+JCYmsmLFCmrVquV0SSIV4oqWfmGJH4DmdeMcrkRE3CwnJ4cxY8Zw0UUX8eSTTwIo8KVGcUVLv3SznaJg+IuIVLZvvvmGIUOGsHbtWiZNmsRNN93kdEkiR80VoV+osBeRKvTqq68yatQo6tWrx6JFizjnnHOcLknkmLiie39bZgEAJ9aNd7gSEXGjLl26cPHFF5ORkaHAlxrNFaG/PSsQ+oUlvnKOFBGpmCVLlnDjjTdiraV169bMnTuXevXqOV2WyHFxRehHegO/RqzW3ReR41RSUsI999xDnz59mD9/Prt373a6JJFK44rQLx3T79C4tsOViEhNtmnTJs455xymTJnCyJEjWblypVr34iqumMi3YXdgCd5obbYjIsfI5/Nx7rnnsnXrVl5++WWGDx/udEkilc4VoV+6s15WfrHDlYhITVNQUEBkZCRer5dnn32WJk2acNJJJzldlkiVcEX3fqnGSTFOlyAiNciaNWvo1q0bDz30EAC9evVS4IuruSL0S2ftJ0RHOlyJiNQE1lqef/55unbtyrZt20hNTXW6JJGQCHnoG2NmGGO+NMZMLOe4p4wxF1bknHnBDXeiI1zxGUZEqlBmZibDhg3j6quv5vTTTycjI4NBgwY5XZZISIQ0JY0xfwG81tqeQEtjTOvDHHcW0NBa+38VOW9uYQkACTGumKIgIlXo+++/Z968edx///0sWLCARo0aOV2SSMiEumncG3gteHsBcOahBxhjIoHngF+NMX+uyEn35gUm8MVo9r6IlMHv97N48WIAevbsya+//sod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9ttvZ8qUKU6XJCLiGu4IfbX1XWH+/PlcfPHF1K5dmw8++IB+/fo5XZKIiKu4o3tfme8K3bp1Y+jQoWRkZCjwRUSqgDtC3+kC5Jh99tlnXHrppRQVFVGnTh1eeOEFGjRo4HRZIiKu5I7QV1O/xvH5fNx777306tWLb775hi1btjhdkoiI67ki9KVm2bJlC+eeey533303Q4cOZeXKlbRo0cLpskREXM8dE/nU0K9Rhg0bxsqVK3nxxRcZNWqUempERELEHaGvUf1qr7CwEJ/PR1xcHE8//TRer5c2bdo4XZaISFhR975UuR9//JEePXpwww03AHDKKaco8EVEHOCK0N+4J9fpEqQM1lpefPFFunbtyqZNm7j44oudLklEJKy5IvRbpSQ4XYIcIisrixEjRjBmzBhOO+00MjIyuOCCC5wuS0QkrLki9DURrPrZvXs38+fP595772XhwoU0adLE6ZJERMKeOybyKfOrBb/fz7x587j44otp0aIFv/zyC0lJSU6XJSIiQa5o6XsU+o7bsWMH559/PpdccgnvvvsugAJfRKSacUdLX5fsOWrhwoWMHDmSvXv38tRTT3H++ec7XZKIiJRBLX05Lv/+97/p378/ycnJLF++nOuuu05zLEREqilXhL4G9Z1z6qmnMnbsWNLT0+nYsaPT5YiIyBG4ontfLf3Qeu2119iwYQMTJkygX79+2gZXRKSGcEVLX2P6oZGbm8vVV1/NkCFDeOuttygpKXG6JBEROQohD31jzAxjzJfGmImHeby2MeZ9Y8wCY8ybxpio8s6pln7VW7VqFWlpacyYMYM77riDjz76iIgIV3QUiYiEjZCGvjHmL4DXWtsTaGmMaV3GYcOBadba/sA2YGD5563cOuVge/fu5cwzz2Tfvn18+OGH3H///URGRjpdloiIHKVQN9V6A68Fby8AzgTWHniAtfapA75NAXYcehJjzDXANQBRDU/SbPEqkp+fT2xsLMnJycyaNYszzjiD+vXrO12WiIgco1B378cDW4K39wANDnegMaYnkGytXXroY9baZ621adbatMCxVVFqePvss89o06YNb731FgAXX3yxAl9EpIYLdejnALHB2wmHe35jTB3gceDKipxUE/kqj8/nY8qUKfTq1YuoqCitmS8i4iKhDv0VBLr0AVKBXw89IDhx73XgDmvthoqcVBP5Ksfm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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr,tpr,label=None):\n",
    "    plt.plot(fpr,tpr,linewidth=2,label=label)\n",
    "    plt.plot([0,1],[0,1],'k--')\n",
    "    plt.axis([0,1,0,1])\n",
    "    plt.xlabel('假正类率',fontsize=16)\n",
    "    plt.ylabel('真正类率',fontsize=16)\n",
    "    \n",
    "plt.figure(figsize=(8,6))\n",
    "plot_roc_curve(fpr,tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9619173727311611"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5-1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 召回率TPR越高，分类器的假正类FPR就越多\n",
    "   * 虚线表示纯随机分类器的ROC曲线，好的分类器应该远离这条曲线，向左上角\n",
    "   * 时使用精度/召回率PR曲线，还是使用ROC，关键在于 正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "   * 例如：前面例子ROC曲线很不错是因为跟负类 非5相比，正类 数据5数量真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC 分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 获取训练集中每个实例的分数\n",
    "   * RandomForestClassifier没有decision_function(),但是拥有dict_proda()方法，sklearn中分类器都有这两个中的一个\n",
    "   * dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
      "  from numpy.core.umath_tests import inner1d\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10,random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf,X_train,y_train_5,cv=3,\n",
    "                                   method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [0.7, 0.3]])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为分数值\n",
    "y_scores_forest = y_probas_forest[:,1]\n",
    "fpr_forest,tpr_forest,threshold_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0. , 0. , ..., 0. , 0. , 0.3])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAF6CAYAAAATeYHoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3hURd/G8e8kJKE36YgIilKEYAhVBQRpIioWihRBafZHee0gCIjYfSyggEgT26OCCiJVLEhJgKgUK0pvCgFCIG3ePyYxIQQSINmT3dyf61qzOXv2nDsI+e3MmTNjrLWIiIhI4AvyOoCIiIj4hoq+iIhIAaGiLyIiUkCo6IuIiBQQKvoiIiIFhIq+iIhIAaGiLyIiUkD4vOgbYyoaY77JZp+3jDHfG2OG+SqXiIhIoPNp0TfGlAGmAcVOsc8NQLC1tjlQ0xhTy1f5REREApmvW/rJQHfg4Cn2aQ18kPp8AXB5HmcSEREpEAr58mTW2oMAxphT7VYM2J76/B8gIvMOxphBwCCAYsWKNapdu3buBhW/Zf/9T9qX1P8et40M245//bh9bPoxTtyWYXvmY+dgH5vhP1m/L30fe9zRsjiWzfR6VsfKZh+b4aAn/hll2Oekf47H/ywn/HnazHuc7P9Jzn8WTSAux0n9C2GCwOBqTEqy2xYcDGllJyUFkpMNwcGp21O3JSZCUBCEhqYd0HA03r2vcOH09x854v7uFitqCEptNsfHQ1KS2y8sFDBw7CgcPWoIKwxFi7j9EhLc+0NDoFhxlzMlBQ4edOcuVSrtzHDokDtPkSKG0FBITkzg753bSEqIp0jxMsQf3r/PWlv+dP+YfFr0c+gwkPpHRHGy6I2w1k4EJgJERkbaqKgo36XLZ6y1HElI5p+4BA4cSeSfIwkcOJLA/rgE/jmSyNHEZFJSLCkWUqzF2vTnKZbU7zO+TqbvLSkpOdk/4+tZ7J9y4v4nnusUx0rJfv+CwJzkeUFnDAQZQ5BxjYqgf783x73mvs/4eur+Qae5f1bHD8rZ/kFBGY+dk3OlbgtK398mw+HDhkLBhtKl0/ffvNmQkmy4+CIITt1/9WpD7AFo3sxQtqzb79efDcuWQbNmhkYRbttvvxo+eB8uusjQ6xa3LT7ecM89EIRh2rT0PL1vgX37DO+9CxUrum0vPA+zZxseehBuutFtmz8fHn/M0KkTPPesO+ae3YZWrQwVK8D3y9N/pk4dDet/goULDeEN3L53DDG8/z6MGWO4/z6379S3DXcMgdtuM0ye5DLt2gWVK0OFCrB7h/s7kZQETZvCmjWwaRNcfLHbPnQovPgiPP28ew7w5ZfQpw907ADTp7tthw9D27YQFwdz5sAFF7jto0fD/v3Qvz/Ur++2zZ8Pv/wC3btDxYpu265dsHOn+75KlbP7+x0XF0fNmjUpWjiEidPfpnv37hhj/jqTY+XHoh+N69JfAYQDP3sbx3dSUiyHjiax/0hC+iMuMcP3ieyPc88PHEn8t9AnJKd4HT1fyMtf/KfzS/2U5wrK9Iv8LH7x52j/zMcPOp39s/j5TpE/OOgMjpf2epaFMKd/vtn2Hp61H3+E2FiIjHStOYDly+G336BFC7jwQrfthx9g3jxo0ACuvtpti4uDF16AokXh//4v/ZgjRsDvv7sCVKGC2/bKK/DFF3DvvdCpk9s2Zw488gh06QLPPuu2RUe7LBER7nmaokVdqzMuzj0HeOshWLEC7lsOzZu5bWMXw1dToM35cFkVVzA/3wHRn0DFq6FzA7ffwYOwYxWULw/1yqQXtAuKQ7HD0OR8916A+pVhUzm4pDKEV3Pb/r4Q2kRA8zpwUep7zwmBvl2hTBmoVjY9e8/rYVskXHgulE0d9TX4NqhZDW66DoqktsCv6wJ1a0OlSumt77Jl3f+P9FY6FCoE06ZBWBhUr378n/vDD0Px4unbOnSAPXuO/39evDisXMkJhg8/cVvHju6RUaVK7nE2EhMTCQkJoVixYrz66qs0btyYGjVqnNUxjRer7BljvrLWtjbG1AVusdYOy/BaSeAbYDHQCWhmrY092bHya0s/OcW6FveR1KKdoSW+/0gCB+LSW+VpxftAfCLJZ9BkLRISTJmiIZQpFkqZoqGpX0MoXTSUoqHBBGfzi/+4109Z2HLwizmAf/FL/nPkiGtNVauW/gt/+XJYuhR69oSaNd22NWvgzTehXTu46ab0/e6+G5o1g/Hj3ba//4Zy5eDcc2HrVrctLs51uyYnuyKf1uLr188VlSlTXKsP3PPbb3ffT5nitu3Z44pluXKwd2969gsugD/+gEWLXIsSYNAgmDQJ3ngDBg9222bOdK3QXr3cc4D1692HgHr14LPP0o957bWuC/mjj6BYauF8803Ytg0GDoTzzkv/2b/+GmrUgK5d3Z/d33+7DzflysEll7j9UlLce0ND3c+gf2K+8+OPP9KjRw9GjhzJzTfffMLrxphoa23k6R7Xk5a+tbZ16tcNwLBMrx00xrQG2gHPnqrg+0pCUsq/BdwV6ITUgp2Y2o2e+jy1uO8/ksjBo4mcyeepEmGFKF0shLJFQyldNDTLYl6maNr37nnhkODc/6FFzsL27XDsmCueacV461b49VeoUye9dTh/vityt90GnTu7batWwV13QePG6cU4IcG12M4/HzZvTj9PWmHL2H07YYIrjjVrpp8/KgomTnSt35YtXcv60CFYu9YVuTSlS7uv27Ydf47rroOPP4aQkPTtLVq4DwJpHyzAtfAfesi1wjO+f9iw9KxpHn/cFdlaGe5PuuceuP769KILcM01sGFDejZwxf6PP074Y+fTT0/clvbhIaMWLdwjo3POgdatj98WFJT+QUF8w1rLG2+8wQMPPEDp0qUpW7Zs9m86Dfmxex9r7X7SR/D76px89ctePlu3g31xCcd1ox8+lnTaxzMGSqcW6NJF04t42WIhqcU8/XnZYm6f0kVCCS2k+ZLEt3btcq3RSpXSu5l37nTdzOeeC+3bu21//w3PP+9avY884rZZ6wrDBRe4VnCaq65yhXjDBlfkAXr3dq3L8ePhjjvctuhoV0yDglx3uDGuSzkqCkqWTD9eUJAr+n/+eXz2tm1h8WKXLU2LFi7XkSPpHzgiIlyRrVYNSpRw25o1c+dJGzwFbmDXpk3HfxAA13LObNAg98goMvL4gg+u2I8efeL7b7vtxG3166dfJ05TuvTxBV8C1z///MPAgQP5+OOP6dixI9OmTaNC2j/KXJIvi76vbdhxkLHzNvLtb/uyfD04yFC6SMgJLe20FnnmLvWyxUIpVSSE4CD1hUnuS052j4zXL3/5xbWG69RxhQtcq2/7dtdyTGtZv/KK606+915XmMFdJ37pJVfQ0wY2rVzpuqn79nXFsWRJV4zHjXOt7bSiD66o/f67K7Rp3b/nnuta+sEZOqGuu84dN2ORbd8eVq92XdVp723c2LX2Mxb9QoVOLNDgfpbM7rgj/UNFmqyKcalS0KjRie9P6zEQ8bVFixbx6aef8vzzz3P//fcTFJT7jcACXfR3HzzKCwt+5sPobVgLJQsXYnCrC6hTuUSGLvRQSoQVIkgFXHLJb7+51nXt2uktyp9+ctdxu3Vz3c/gWsFPPw0NG7ruYYCpU9NHDf/wQ/oxmzRxA832709vFT7/PHzzDdStm170Y2LcNeDrrkt/b9Wqrjs5Yy9ilSpunxIljh8sNXasG4CVxhhYtix90FiahQtP/LkfeMA9MmrcGGbPPn5bqVJue2YZu7xFAkVycjIxMTFERETQrVs3IiMjqZnxmlEuK5BF/0hCEhO//oM3l/1BfGIyhYIMvZtX5762tShTLDT7A0iBlpQEH37oilPaCO2UFDci+Kef3OjttG7qatXcteONG10LMjkZbrjBXcv98MP0QWULF8Lrr7tjphX9PXtct3JcXPq5u3RxXzOPF6ldO/2+3jTXXeeu/WYcQXzXXW57eHj6tqFD01v4aZo0yboYP/roiX8eWbWWRSR727dvp3fv3qxYsYKff/6Z8847L08LPhSwop+SYvlozTaeX/Azuw8eA6B93Yo80qk2NcsXz+bdEuj27oXPP3ct2rSW8Ny5cN99brDWggVu2759cMstrsX7zz9uW3w8fPABbNniRlZfcolrJdeu7bqqkzNMEnLTTa7oZ2wxh4e77vSqVdO3XXqp+2CQ1koHly0x0XV3Z7RixYk/T+ZCDu7adsQJ012JiK99/vnn9OvXj/j4eCZMmEC1atV8cl5PbtnLTTm9ZW/5b/sYM3cjG3a6GYAvqVqSYZ3r0qzmOXkdUTyQ8fry7t3uenDNmumDyubMcbcqdejgBqyBK85Nm7prv6tXp7+3UiV3b3Z8vNuWkOAGkB086LrL04wc6UZ9Dx+efl/wgQPu2nQeXJoTET9kreWBBx7g5ZdfpmHDhrz33ntcfAYDSfzqlj1f+m3PYZ6et5HFm9zMC5VLFebBDhdzfcOquk6fjyUluUKZViwXLnS3arVv7waSWetaxps3u0FpXbu6/SZNciOqBwxwz8F1U993H4wa5VrpV1zhut2tda3mNBUqwK23Hn8LVoUKbsT5+eenbwsNddfKMxs58sRtGnUtIhkZYwgODubee+/lmWeeoXDabE8+ErBF/+DRRJ7/8mfeWbmF5BRLsdBg7mh9AbdfXpMiobqvPb/4+mt3r3Tfvund3eHhbpDa6tXpI67Hj3fF+6OPXAGOj3cjxN9+23VXpxX9tNZ9Wnc6uFHqhQu7CUmuuMJtq1fPdc1nHA1+/vluoFxGxqS/R0TkTFhrmT59OrVq1aJFixY899xznk0mFrBFf+Sc9Xy8djtBBno2OY/729WiQgnffqKS482d6warvfCC62Y/ehSeecYNfGvYEJo3d63oOnVc0f/zz/Si366dG+me1m1etCjceKO7Rp42Gxq4e59vu+347vQLLnDd7BmFhbmHiEheOnToEHfccQfvvPMOffr0oUWLFp7OHhqQRf/Q0UTm/rgTgNl3XUaDc9XHmpfWrYMlS1x3e1rLedgweOop1zpPGxQ3Z467fn7jja6wFy7sinpsrJutrVUrt9/LL7vb1zJ2jd9554nnDQ8/fhQ66Nq5iOQfUVFR9OjRg82bNzN69Ggezer2Fx8LyKI//6ddHEtKoUmNsir4ueyjj9yAt+bN3aQv4G5VW7DAXSe/9lrXgj7oxkvyxRduIYqwMHe7WeXKrls+zZNPukdGZ7tIhYiI11atWsXll19OpUqVWLZsGZdffrnXkYAslq0NBHPWubUVu15aNZs9JY217h7ztFHr4GZfK1HCDZRLs3mzm8Ft/vz0bTfd5Ir5rl3p19SHD3fd8y+9lN6N3qWLK/AdOuT5jyMi4omUFLfqaaNGjRg2bBjr1q3LNwUfArDo7z54lO9+30docBBXX1I5+zcUAGnzkKdZutS1yF97LX3bk0+6Wd5eftntm5zsbl87fBg++SR9vw4doEcPN8FMmoEDYccOt1hI2tSw5cu76+9FiuTtzyYikl8sWrSIhg0bsmPHDoKDg3niiSdyfcGcsxVwRf+zmB1YC1fWLk+poiHZvyHAxcS469z9+6ffohYb66ZiffPN9P3Sivi337rb2oKD3aj4Tz5x97inqV8f3n03fREWEZGCLjExkUcffZT27duTlJTEwbTrm/lQwBX9T9ZuBwpO1358fPq95m++6Yp1xoGhaS3vDz5wk8qEhLiC3bXr8d32DRq4DwV//ZW+lGapUu66fcWKvvlZRET8zebNm7niiisYN24cAwYMICoqitq1a3sd66QCquj/uvsQ63ccpEThQrS+OHeXI8wPMk4m8/vvbjBd0aJu+lhr3brbt97qXl++3H2tUcMt3HLsWPq19aJF3XKmAwf6/mcQEQkko0aNYtOmTbz//vtMnDiRoplXn8pnAqroz17nWvmd61emcEhgTcCzcKEbVDd5svu+Ro30pUfnzXMLvlStCiNGuAF0zZu71woXdt30oVpHSEQkVxw5coRt27YB8NJLL7F27Vq6devmcaqcCZiin5Jimb3Wjdq/rqH/d+3Hx8P//ueKObiV1uLiYOJEty0oKL3LfsCA9HXLq1d3Dw/nfhARCVg//vgjkZGRdO3alZSUFEqXLk2NGjW8jpVjAVP0o7fsZ/uBeCqXKkzTGvlrtOTp+u471wV/882uGx/ccqs33QQzZ6ZPQFOqlLtGLyIiectay4QJE2jcuDH79+/n6aefJsgPZwPzv8Qn8VlMeivf3xbS2b/fja4fP95936IFfPmle/7pp+5r2bJumdV69bzJKCJSUMXGxnLjjTdy5513cuWVVxITE8NVV13ldawzEjAz8m3aeQiAK2qV8zjJ6VuwwC30Eh/vin+RItCmjevGVze9iIi3QkND+euvv3j++ee5//77/bKFn8Z/k2eybb+bfaZamfw9ctJaN6Ndgwbw229uW7dubjGZyy5zA+8AChVSwRcR8UpycjL//e9/OXToEEWKFGHlypUMHTrUrws+BEhLPyEphZ0HjxJkoHLp/LeSXnw8bNoEl17qvr7wAuzZ426ru/BCV9z37vU6pYiIAGzbto3evXuzbNkyChcuzODBgylUKCDKZWC09HfGxmMtVC5VhJDg/PUjWesG5T3wgHtepw5s2+bup2/c2Ot0IiKS0WeffUbDhg2Jiopi6tSpDBo0yOtIuSp/VcgztPWfeADOLZM/Jno/fDi9694YuOgi+OorV+zBjbifOtV9ABARkfzh9ddf59prr+W8884jOjqaW2+9FRNg11kDouinXc8/Nx9cz3/sMTeJzsKF6SvWTZzolpqtVs3bbCIicnLXXHMNDz30EN9//z0XX3yx13HyREAU/a3/Fn1vWvq7dqU/79wZHnoI7rwzvWXfqpX7ICAiIvmHtZapU6fSvXt3UlJSqF69Os888wxhaXOWB6CAKPrb9rvu/Wplfd/S79rVrSU/YoSbF/+yy+C++yApyb0mIiL5z8GDB+nduzf9+/dnz549HD582OtIPhEQRX/rP75v6Sclufvou3aFTp3gmWfcGvQAVaqkT4srIiL5y+rVq4mIiOD9999n9OjRLFq0iJJpi5kEuIAo+mktfV8U/TVr3EI348a56XD79oX33oOjR9PvsRcRkfwpMTGRbt26kZiYyLJlyxg2bBjBBaiV5vdF31rYc+gYhYIMlUrmfdWdNs3dgjd+PPz9t9tWQD4gioj4rb1795KUlERISAiffPIJ69at47LLLvM6ls/5fdFPSHbL0FUuXZhCeXSPvrVu9D3Af/8Lb7/tiv455+TJ6UREJBctXLiQ+vXrM2rUKAAaNmxImTJlPE7lDf8v+kmu6J9bOm8G8SUkQMWKcOONsGWL29apE1x/fZ6cTkREckliYiKPPPIIHTp0oGzZstx8881eR/Kc3xf95BQLwDnFQ/Pk+EFBruAvWuSWtRURkfxv8+bNXHHFFTzzzDMMGDCAqKgo6tev73Usz/n9ZMIp1hX9oqG5OxDj4EF3rb5QIRgwAAYOhIiIXD2FiIjkkf3797N582Y++OADtfAz8PuWfnrRz73PL9HRbnGcRYvc940aqeCLiOR3cXFxvPPOOwBERESwefNmFfxMAqDou6+52dJ/+GH480+4/XY34Y6IiORvP/zwA5GRkfTp04f169cDULSo91Oz5zcBUPRzv3t/0SL47DP4/nu3OI6IiORP1lrGjx9PkyZNOHDgAAsXLqRevXpex8q3/L/op+RO935iIlx7LWzc6L6/+mo3s56IiORf/fr146677qJNmzbExMTQtm1bryPlawEwkM99PduWfvv2bvnbBg1gzJizzyUiInmvffv2hIeH85///IegIL9vx+a5ACj6ruoXOcui/9hjUK8e1KyZG6lERCQvJCcn89RTT1G5cmUGDhxIr169vI7kV/z+Y9HZjt5PG6jXrh2MHAm33ZZLwUREJFdt27aNtm3bMmLECFavXu11HL/k/0XfTchHsTNo6R89Cjff7Lr1k5KgXLnczSYiIrnj008/JTw8nKioKKZNm8bEiRO9juSX/L/on0X3/tChMGcOXHklxMXldjIREckNGzdu5Prrr6d69eqsWbOGvn37eh3JbwXMNf0z6d5/+WW44Qb47TcoVSq3k4mIyNmIjY2lVKlS1KlTh08++YSOHTsSFhbmdSy/FgAtfff1TEbvh4RA27YweHAuhxIRkTNmrWXq1KlUr16d5cuXA3Ddddep4OeCACj6pz85T2ysu46/dWsehRIRkTNy8OBBevXqRf/+/bn00kupXr2615ECiv8X/TOYnOeBB9x1/N698yqViIicrtWrV3PppZfywQcfMGbMGBYtWkTVqlW9jhVQ/P6avgWMgcIhOf/8cvXVbuBeixZ5l0tERE7PwoULSUpKYtmyZVx22WVexwlIxqZ2j/ursMq17IUDX2X9qI6n9b6UFNDkTSIi3tq9ezd//PEHzZs3Jzk5mUOHDlG6dGmvY+V7xphoa23k6b4vIMpeTm/XO3oUkpPdcxV8ERFvLViwgPDwcLp3705CQgLBwcEq+HksIEpfcJDJ0X6jR0PVqvDss3kcSERETioxMZFHHnmEDh06cM455zB37lxCQ0O9jlUg+P01fYBgk7Oiv2IF7N0LFSvmcSAREcnSwYMHad++PStXrmTQoEG89NJLWvfehwKi6AflsKW/eDGsWgXh4XkcSEREslSiRAkuueQShg4dys033+x1nAKnQHXvAzRpAprfQUTEd+Li4rjrrrv49ddfMcYwefJkFXyPBETRD8qme3/rVhgzBv780zd5RETE+eGHH4iMjGTChAksWbLE6zgFXoAU/VO//vTTMHw4DBjgmzwiIgWdtZbXX3+dJk2aEBsby6JFixisOc895/Oib4x5yxjzvTFm2EleL2OMmWeMiTLGvJmTY2bXvX/VVXDppXDRRWcQWERETtubb77J3XffTdu2bYmJiaFNmzZeRxJ8PJDPGHMDEGytbW6MmWKMqWWt/TXTbn2Ad6y17xhjZhljIq21Uac6bnbd+zfcANdff3bZRUQke8eOHSMsLIxbb72V0NBQ+vfvj8nhHVaS93zd0m8NfJD6fAFweRb7/A1cYowpDVQDsl0WJycD+YKCNCGPiEheSU5O5sknn6Rhw4YcOnSIIkWKcNttt6ng5zO+LoPFgO2pz/8Bsrpj/lugOnAvsDF1v+MYYwaldv9HwamL/osvwqxZsGfPWSYXEZEsbdu2jTZt2jBy5EgiI097ZljxIV8X/cNAkdTnxU9y/hHAEGvtKGAT0D/zDtbaidbayLR5h0/VvT90KPTqBdHRZxtdREQymzNnDuHh4URHRzNt2jRmzJhBiRIlvI4lJ+Hroh9Nepd+OPBnFvuUAeobY4KBpriF9E7pVC39V1913foaQyIikrtSUlJ47rnnqF69OmvWrKFv375eR5Js+Lrozwb6GGNeBLoB640xYzLt8zQwEYgFygLvZnfQU13Sv+su2LJFE/KIiOSWTZs2sXfvXoKCgvj444/5/vvvuUi3R/kFnxZ9a+1B3GC+FcCV1toYa+2wTPusstbWs9YWt9a2s9Yezu64p+reN8YtsiMiImfHWsuUKVNo1KgRDzzwAAAVKlQgTK0qv+Hz8ezW2v3W2g+stbty65gn697v2xfefx8OHcqtM4mIFEyxsbHccsst3H777TRt2pRnnnnG60hyBgLiJrasiv7evTBjBvToATbbUQEiInIy69evJyIigg8//JAxY8awcOFCqlSp4nUsOQOBscpeFt371sLEibBmDZQs6UEoEZEAUaFCBSpWrMiMGTNo0aKF13HkLARE0c+qpV+hAgwc6EEYEZEAsHv3bl544QXGjh1L+fLl+e677zTRTgAIiO797KbhFRGRnFuwYAENGjTg1VdfZc2aNQAq+AEiIIp+cBY/xXPPwccfQ0KC7/OIiPijhIQEHnroITp06ED58uVZvXo1TZo08TqW5KKA6N7P3NKPj4eHHoLgYIiL8yiUiIif6d+/P7NmzWLw4MG8+OKLFC1a1OtIkssCo+hnuqZ/5Ag89hj88osm5RERyU5ycjLBwcEMHTqUG264gRtvvNHrSJJHAqLoB2dq6Z9zDowaBQcOeBRIRMQPxMXFce+99xIaGsqECROIiIggIiLC61iShwLkmv7xRX/XLtfaP+ccjwKJiORzMTExREZG8vbbb1O2bFmsJjQpEAKi6Ge+pt+5s5tvX4P4RESOZ63ltddeo2nTpsTGxrJo0SKeeuopjc4vIAKi6GccvZ+Y6CbkGTLEPRcRkXTbt2/n0UcfpW3btsTExNBGS5AWKAFR9DO29OPj4Y473NdixTwMJSKSj/z0009Yazn33HNZtWoVn3/+OeXLl/c6lvhYQBT9jN1SJUvC+PEQFeVhIBGRfCIpKYmRI0cSHh7OzJkzAahTp4668wuogBi9r7+7IiIn2rp1K7169eKbb76hT58+XH/99V5HEo8FRNHPOHh/yRIoXBgaNgTNKyEiBdXcuXPp27cvx44dY/r06fTp08frSJIPBEb3PulV/+674bLL4NdfPQwkIpIP1KhRg7Vr16rgy78CouhnbOk3bgytWkGlSt7lERHxwsaNG3n77bcB6Ny5MytXrqRWrVoep5L8JCC69zMOSJk2zcMgIiIesNYyZcoU7r33XkqVKsXNN99M8eLFCQ4O9jqa5DMB0dLXQD4RKahiY2Pp2bMnAwYMoFmzZkRFRVG8eHGvY0k+FRgt/dRr+gcOuMf553ubR0TEF44dO0aTJk34/fffGTt2LA899JBa93JKAdHST7umv3Il1KgBvXp5m0dEJC+lzZMfFhbG/fffz9dff82jjz6qgi/ZCoiin9a9f+gQlCoF+nsvIoFq165ddOrUiS+++AKAIUOG0KJFC49Tib8IiKKfNg3vTTe57v3p0z0OJCKSBxYsWEB4eDjLli1j3759XscRPxQQRR8N5BORAJaQkMBDDz1Ehw4dKF++PFFRUbr3Xs5IQBT9zEvriogEkjlz5vDcc88xZMgQVq9eTb169byOJH4qIIp+Wsl/9FFo3hwWLfI0johIrtiyZQsAN910E9999x0TJkygSJEiHqcSfxYQRe/+ObEAACAASURBVD+tpb9uHaxY4ZbVFRHxV3Fxcdx2223Uq1ePzZs3Y4zRYD3JFYFxn35qU/+NN2DbNqhTx9s8IiJnat26dfTo0YNffvmFxx57jGrVqnkdSQJIgBR9V/WrV3cPERF/9NprrzF06FDOOeccFi1aRJs2bbyOJAEmILr3NYxPRALBjz/+SLt27YiJiVHBlzwREC39IGM4cABGjIAqVeDhh71OJCKSM8uWLaNkyZJceumlvPrqq4SEhBy3iJhIbgqMlr6BLVvglVdg0iSv04iIZC8pKYkRI0bQpk0bhg0bBkBoaKgKvuSpAGnpQ+XK8Prr8PPPXqcRETm1rVu30qtXL7755hv69u3La6+95nUkKSACougbYyhfHoYMgaCA6LsQkUD1008/0bJlSxITE5kxYwa9e/f2OpIUIAFRItN6w1TwRSS/q127Nt27d2fNmjUq+OJzAVEmDYbVq+H99+H3371OIyJyvI0bN9KpUyf27dtHoUKFmDBhArVq1fI6lhRAAVH0gwxMmwY9esBnn3mdRkTEsdby1ltvERkZSXR0NL+rVSIeC4iibwyEh0O3btCggddpREQgNjaWnj17MmDAAJo3b05MTAxNmzb1OpYUcAExkC/IGAYMhIEDvU4iIuI8+OCD/O9//2Ps2LE8/PDDBGnQkeQDAVH0RUTyg5SUFGJjYylTpgxPPfUU/fv3p3nz5l7HEvlXQBT9IGPYvRvCwqBkSY3iFxHf27VrF3379uXIkSN89dVXlC9fnvLly3sdS+Q4AVEegwxUqgRlysCOHV6nEZGC5ssvvyQ8PPzfyXaCg4O9jiSSpYAo+sYYLrjAPS9e3NssIlJwJCQk8OCDD9KxY0cqVKhAVFQUgwYN0lS6km8FSNGH336D3buhdGmv04hIQXHs2DFmz57NkCFDWLVqFfXq1fM6ksgpBcQ1/bRP1RUqeBxERAqEOXPm0L59e0qUKEF0dDQlS5b0OpJIjgRESx9cS19EJC8dPnyY/v37c/311/P6668DqOCLXwmIor91C7RsCVdd5XUSEQlU69ato1GjRkybNo3hw4fzn//8x+tIIqctILr3E47Bzp2gAbMikhfef/99+vbtS7ly5Vi8eDFXXnml15FEzkhAFP3za8Aff3idQkQCVUREBF27duW1116jXLlyXscROWMB0b1fqBDUqOEeIiK5YdmyZdx7771Ya6lVqxbvvfeeCr74vYAo+rolVkRyS1JSEiNGjKBNmzbMnz+fv//+2+tIIrkmIIr++p/gzjvh88+9TiIi/mzr1q1ceeWVjBo1ij59+rBmzRq17iWgBMQ1/bVrYf4EKF8errnG6zQi4o+Sk5O56qqr2LFjBzNnzqRXr15eRxLJdQFR9Js1N1x9MVSr5nUSEfE3R48eJSQkhODgYCZOnEjVqlW58MILvY4lkicConu/1oXQqxdcfbXXSUTEn2zcuJEmTZrw3HPPAdCqVSsVfAloAVH0AcqWhdBQr1OIiD+w1jJ58mQaNWrErl27CA8P9zqSiE/4vOgbY94yxnxvjBmWzX7jjTFdcnLMPzfDF1/Arl25k1FEAldsbCw9e/Zk4MCBtGjRgpiYGDp16uR1LBGf8GnRN8bcAARba5sDNY0xtU6y3xVAJWvtZzk57tx5rmt/xYpcDCsiAWnDhg3Mnj2bsWPHsmDBAipXrux1JBGf8fVAvtbAB6nPFwCXA79m3MEYEwJMAuYZY66z1s7J7qDnnw+lOkHVqrkbVkQCQ0pKCl999RVt2rShefPm/Pnnn1SqVMnrWCI+5+vu/WLA9tTn/wAVs9inL7ABeBZoYoy5J/MOxphBxpgoY0wUQJdrYN48aNw4j1KLiN/auXMn7du3p23btkRHRwOo4EuB5euifxgokvq8+EnOfykw0Vq7C5gJnLCyhbV2orU20lobmWdJRcTvzZ8/n/DwcJYvX86kSZOIiIjwOpKIp3xd9KNxXfoA4cCfWezzG1Az9Xkk8Fd2Bz2WAImJYG1uRBSRQDBs2DA6depEpUqViIqKYsCAARjN2S0F3FkXfWNMUOrAu5yYDfQxxrwIdAPWG2PGZNrnLeBKY8zXwJ3A89kddPgwd7ve1q2nk1xEAlm1atW48847WblyJXXr1vU6jki+YGw2zWNjTCgwFBgHFLbWxqduLwx0xw3M+9taWzRHJzSmDNAO+Dq1C/+shFWuZavUXcxfS89j714455yzPaKI+KtZs2YRHBxM9+7dvY4ikqeMMdFncok7Jy39IOBB4B7giQzbZwKPAQZIzOkJrbX7rbUf5EbBTzNunOveL1s2t44oIv7k8OHD9OvXj169ejFt2jSya8yIFFQ5uWUvAYgD5gFRxpjvgVq42+8aWWuPGGOS8y5i9gyG4GAvE4iIV9auXUuPHj349ddfGT58OE888YSu3YucRLZF31qbYoxJtNb+Zoy5H9gCrAVWAdcZYz449RFERPLGH3/8QbNmzShfvjxLliyhdevWXkcSyddOdyDfLmvtOqAc8ArwHOD52nb33gd9+3qdQkR8JSkpCYCaNWvy3//+l3Xr1qngi+RAjou+MaYJ8JExpiPuVro/gN3W2tW46/qeOXwYZs/2MoGI+MpXX33FRRddxNq1awEYMmQI5cqV8ziViH84ZdE3xjQzxqRNg7sW17KfjZtN72agTOrtd0WMMS+mPl42xryRp6kzefhhmDHDl2cUEV9LSkriiSeeoE2bNoSEhBAUFDCLhIr4THbX9Gvips4NAT4BRgL34e6lt8BB4ALch4caqe8JBgrnQdaTuvhiuE5z84kErC1bttCrVy++/fZb+vXrx6uvvkrx4sW9jiXid05Z9K21s4BZxphtuAL/DK7YtwXmAEWB24FfrbVd8zjrSWmcrkhge/vtt4mJiWHmzJn06tXL6zgifiun/WMJ1tpbgP1AKeAocBNQEqiO+yDgmWnT4APdQyASUOLj49mwYQMAjz32GD/88IMKvshZOt2LYm8AdYC/cV3/kdba6FxPdZq++gqez3ayXhHxFxs2bKBp06a0b9+e+Ph4QkJCOP/8872OJeL3si36xs1yEWaMKQu8h7u+Xwx3y16FvI2XM506GTp39jqFiJwtay0TJ04kMjKS3bt3M3nyZIoUKZL9G0UkR3IyI18Y7tp9R+Bda+1PAMaYvsB0Y0wLIDTvImave3e4qZGXCUTkbMXHx3Prrbfy4YcfctVVVzFjxgytey+Sy3LSvZ8E3I1r5T+SttFa+wXwMpCC+2DgGQ3kE/F/YWFhHDt2jHHjxvHll1+q4IvkgZxMw5sEvJP6bVym155O7f73tJ29ZSvsPQ/Kl/cyhYicrpSUFF588UW6devGeeedx+zZszVvvkgeOuvZLazzQ26EOVPDh8Err3iZQERO186dO2nfvj0PPvgg06ZNA1DBF8ljOSr6xpgwY8zHxpiw1O/LGWMqGGOKGWOSjTHFMuw73RhzWV4FzkrVqr48m4icrS+++ILw8HCWL1/OpEmTGDZsmNeRRAqEU3bvG2OMdQtTpwDXpX4FmIJbaKcp7pL6sdT9SwI9gM/yKnBWhg+Hns19eUYROVPvvfcePXv2pH79+rz33nvUrVvX60giBUZ2Lf05xphrrbWJANbaRGPMQNxI/qHW2gS32Sal7t8XN4GPT5e/KVoUgoN9eUYROV2u/QCdO3fmiSeeYOXKlSr4Ij520qJvjAnCLbLzburteRhjqgEvAA9Za5dk2r8w8B9gRNqHBF/RZUCR/G3mzJlcfvnlxMfHU6JECZ588kndfy/igZMWfWttirV2BG41vT6pm18BVlprX87iLU8DO4GJuZ4yG3ffDbNm+fqsIpKdw4cP069fP/r06UNQUBCHDh3yOpJIgZaTW/bmAfOMMSnAw8BhOO56vzHGvABcDzSz1qac/Gh5I/YAHDvm67OKyKmsXbuWHj168Ntvv/HEE08wfPhwChXKyXxgIpJXshvINx84kvqtBcYBQamj+A8YY5qkvtYFaG6t3Z1nSU/h1VcN3Zp6cWYRyYq1ljvvvJO4uDiWLFlCq1atvI4kImTf0l9D6sh8XEu+DvA+btrdHcBy4L/AucATxpj7fH09H6BMGShWLPv9RCRv7du3j0KFClG6dGlmzZpFiRIlKFeunNexRCTVKUfvW2sfs9Y+iRu8B24p3eKp21+z1r6K6wFoCDQGJuVpWhHJt5YuXUqDBg24++67AahRo4YKvkg+k5NV9p4GFuGK+xVAL2PM3Rn3sdb+gruPv5Mx5tq8CHoqkydDTIyvzyoiAElJSQwfPpy2bdtSsmRJ/u///s/rSCJyEqcs+saYB4ABwH0A1to/gF7A08aYmmm7pb62A3fNf0SepT2JpUth+3Zfn1VEtm7dSqtWrRgzZgz9+vUjOjqahg0beh1LRE4iu5b+T8A1wCpw9+6n3p//OfB8FvtPAy4xxlySqymzMXAg1K/vyzOKCEBQUBC7du1i1qxZTJkyhWIaXCOSr2V3TX+BtXYlbuCewV3TB9eiv9YYczG4uflT9/8HN6FP1zxLnIUrr4Rq1Xx5RpGCKz4+nldeeYWUlBSqVq3Kpk2b6Nmzp9exRCQHcrrKnsWN0k8BsNbGAM2Av4BlHL+k/bvA4lzMKCL5xPr162nSpAn33XcfX331FQAhISHehhKRHMtR0bfWJlhr77fWHsywLcpae9Rae6W19miG7f+11i7Pi7AnExUFBw748owiBYu1lokTJ9K4cWP27NnD/PnzadOmjdexROQ05bSln6+9+KLhr7+8TiESuO6//34GDx7MZZddRkxMDB06dPA6koicgWznxDTGFAIqW2u35mDfC4Bx1tqbcyNcTjVq5CboEZG8cfPNN1O5cmUefPBBgoICoq0gUiCZtOUuT7qDMRHAt9baohm2VQLmAS0ydu0bY8JT9y2RR3lPEFa5lv1w/jKuDa/iq1OKBLzk5GSeeeYZDh48yLhx47yOIyKZGGOirbWRp/u+nHxkPwpknlo3EQgHEjJtT8hiXxHxIzt27KB9+/Y8/vjj/PXXX6Sk+HwNLRHJIzkp+smpj4ySwC2/m2m7J78dkhIhmw4LEcmBefPmER4ezvfff8/kyZOZNWuWuvNFAkhA/Gvu0xf27PE6hYh/27NnDzfddBNVqlQhOjqa22+/HWNM9m8UEb8REItbBwe7h4icvt27d1OxYkUqVKjA/PnzadKkCYULF/Y6lojkgZy29EsZY/5IewAxgMm4LXX7oryLenIzZ4IW8xI5fTNnzuTCCy/k3XffBaBly5Yq+CIBLKct/aPAkznYrwrw4JnHERFfOHToEHfffTfTp0/niiuu4PLLL/c6koj4QE6L/jFr7bTsdkqdi19FXyQfW7NmDT169OD3339n5MiRPP744xQqFBBX+kQkGwHxL33sWOg4A0JDvU4ikv/9/vvvxMfHs3TpUlq2bOl1HBHxodMu+saYAcAVnHgbH0Cps050Bn78ETTIWOTk9u7dy4oVK+jSpQs333wzV199tZbBFSmAclL0DccP+CsKlCX1Xv1MiudGqNPVpzeod1Ika0uXLqVXr17ExcXx119/Ubp0aRV8kQIqJ6WycOoDAGvtK8ArWe1ojKkD+HSFPYDOndXSF8ksKSmJkSNHMnbsWC666CLmzZtH6dKlvY4lIh7Ktuhba9eRoehnIxQoclaJROSsJSYm0qZNG7799ltuu+02XnnlFbXuRSR3ZuQzxjQwxgQDPwIVc+OYp+PLL319RpH8LSQkhI4dOzJr1izeeustFXwRAXK2yl5TYHUW8+ynvR6MW2inKvA3cIG1dlNuBz2ZsMq1bNEKy9gfo1X2pGCLj49n6NChdOvWjdatW3sdR0TyUF6usvcup+jet9Ym4wb7HQN6A4tSPwj4TIcOvjybSP6zfv16mjRpwoQJE1i5cqXXcUQkn8rJQL4E4JgxZmTq91m1+C3uFr7/AP9L/SDgM716+fJsIvmHtZZJkybxn//8hxIlSjB//nw66FOwiJxETop+WpG/D/gBuBxYATQDfiX9fv36wAVAm1zOKCIn8emnnzJ48GDatWvH9OnTqVSpkteRRCQfO52BfBZoj+vKvyH164vAqNTn1wPvW2v/zu2Q2dm3z9dnFPHWoUOHAOjSpQvvvfce8+fPV8EXkWydyeh9m/rIvO0N4IWzTnQGHn/ci7OK+F5ycjJPPfUUF1xwAVu2bCEoKIju3bsTFJQrN+KISIA7afe+MSYImISbfa8lkHFwXlZT4ey11h7M3Xg5c+SIF2cV8a0dO3bQu3dvli5dSs+ePSlVypNZr0XEj53qmn4Ibqnc4sA83MQ7+dLUqV4nEMlbc+fOpV+/fhw5coQpU6bQr18/jKahFJHTdNI+QWvtMWttJ2ALrvDHZnOs2saYm3MzXE5p3n0JdO+99x5VqlQhOjqa/v37q+CLyBnJabm0J/maUTugH/DhWWYSEeDXX38lJSWFiy++mAkTJlCoUCEKF87pjNgiIifK6egfk/pYmfp1Uer2x4Fxqc8nAaHGmE65mjAHRo/29RlF8taMGTOIiIhgyJAhABQvXlwFX0TO2um09MekPp+a6TWDG7V/FHgJGAh8cbIDGWPeAuoCc621Y06xX0VgvrX20uzC7dmd3R4i/uHQoUPcddddzJgxg5YtWzJ9+nSvI4lIAMlJ0Q8FCltrs7wdz7iLiy/gRvdPB0YYY0KstYlZ7HsDEGytbW6MmWKMqWWt/fUk532eHK7Y9/iwnOwlkr9t3ryZ9u3b88cffzBy5EiGDRtGcLBPZ7QWkQCXk6L/Oumz7mWlMK61H2at3WWMaZNVwU/VGvgg9fkC3Ox+JxR9Y0wbIA7YlYN8aE4SCQRVqlShTp06vPXWW7Rs2dLrOCISgLK9pm+tfclae+wUr8cDNYDdqd+vPcXhigHbU5//QxbL8BpjQoHhwCMnO4gxZpAxJsoYE5VdfpH8bO/evQwePJjY2FjCwsL49NNPVfBFJM/kyjRe1tq/bHZr9DqHSe+yL36S8z8CjLfWHjjF+SZaayPTlhX89NPTTSzivSVLlhAeHs7UqVNZsWKF13FEpADw9dyd0bgufYBw4M8s9rkKuMsY8xXQ0BgzObuDfvVVLqUT8YGkpCQef/xxrrrqKkqWLMmqVau0Mp6I+ISvp7WZDXxjjKkCdAJ6GGPGWGv/HYpnrf23b9MY85W1dkB2B+3SJU+yiuSJhx56iJdeeonbbruNV155hWLFinkdSUQKCJOzXvlcPKExZXAT+Xxtrc3RQL1TCatcy3705TKuaVDl7MOJ5KGEhARCQ0PZvn073377Ld27d/c6koj4KWNMdNol7tPh86W5rLX7rbUf5EbBF/EHR44cYfDgwVxzzTWkpKRQtWpVFXwR8URArMe5+Q/NQy75008//USTJk2YOHEiERERpKSkeB1JRAqwgCj6EyZ4nUDkeNZa3njjDRo3bsy+fftYsGAB48aNo5BWhxIRDwVE0a9Z0+sEIsc7fPgwY8eOpVWrVsTExNCuXTuvI4mI+Hz0fp644w6vE4g40dHR1K9fnxIlSvDdd99RtWpVgoIC4rO1iAQA/TYSyQXJyck89dRTNG3alOeeew6AatWqqeCLSL4SEC19ES/t2LGD3r17s3TpUnr27Mk999zjdSQRkSwFRDNk9GivE0hBlTaV7sqVK5kyZQrvvPMOJUuW9DqWiEiWAqKln5TkdQIpqMqXL8+FF17I22+/Te3atb2OIyJySgHR0n/8ca8TSEHyyy+/8PTTTwNQv359li9froIvIn4hIIp+aKjXCaSgmD59OhERETz//PPs2LEDAGM0OZSI+IeAKPoiee3QoUP06dOHW2+9lUaNGhETE0OVKlrvQUT8S0AU/U9me51AApm1ljZt2jBr1ixGjhzJkiVLOPfcc72OJSJy2gJiIN+mjV4nkECUkpKCMQZjDMOHD6d06dK0bNky+zeKiORTAdHSv/46rxNIoNmzZw/XXHMNr732GgDXXnutCr6I+L2AKPp163mdQALJ4sWLCQ8PZ8mSJYRqlKiIBJCAKPoiuSExMZHHHnuMdu3aUaZMGVatWsXgwYO9jiUikmsCouhvWO91AgkEUVFRjBs3jttvv53Vq1fToEEDryOJiOSqgCj6877wOoH4s40b3UjQ5s2bExMTw6RJkyhWrJjHqUREcl9AFP0KFbxOIP7oyJEjDB48mEsuuYSVK1cCboY9EZFAFRC37N10k9cJxN/89NNP9OjRg/Xr1/Pwww8TERHhdSQRkTwXEEW/aFGvE4g/mTx5Mvfccw+lSpViwYIFtGvXzutIIiI+ERDd+0ePep1A/ElsbCytWrUiJiZGBV9EChRjrfU6w1kJq1zLtu78NV9Orux1FMnHvvvuOw4dOkTHjh1JSUkBICgoID7zikgBZIyJttZGnu77AuK3XuHCXieQ/Co5OZkxY8bQqlUrhg8fjrWWoKAgFXwRKZAC4jffEM2fIlnYvn07V111FcOHD6dbt24sXrxYy+CKSIEWEAP5RDLbvn074eHhxMfH8/bbb3Prrbeq4ItIgaeiLwHFWosxhipVqnD33XfTo0cPateu7XUsEZF8ISC69//3kdcJJD/45ZdfaNmyJRs3bsQYw8iRI1XwRUQyCIiiv2un1wnES9Zapk2bRkREBBs2bGDHjh1eRxIRyZcCoujfeKPXCcQrhw4dok+fPvTr14/IyEh++OEH2rZt63UsEZF8KSCKfmXdol9gvfTSS7z77ruMGjWKxYsXU7VqVa8jiYjkWxrIJ34nJSWFXbt2UaVKFR5++GE6duxIkyZNvI4lIpLvBURLf81arxOIr+zZs4drrrmGyy67jMOHDxMWFqaCLyKSQwFR9FNXRZUAt3jxYsLDw1myZAkPPvig1rwXETlNfl/0gwiiSUSw1zEkDyUlJfHYY4/Rrl07ypQpw6pVq7jzzjs12Y6IyGny+6Jfr2oJht1ewesYkoeMMSxfvpwBAwawevVqGjRo4HUkERG/pIF8km99/PHHtGjRgkqVKjF//nwKa2UlEZGz4vct/fh42KnJeQLKkSNHGDRoEDfeeCPPPfccgAq+iEgu8Puiv2EDjB7tdQrJLT/++CONGzdm8uTJPPLII4wbN87rSCIiAcPvu/cLF9bkPIFi/vz5dO3alVKlSvHll1/Srl07ryOJiAQUv2/p16sHw4d7nUJyQ5MmTejRowcxMTEq+CIiecDvi774t2+//ZabbrqJhIQEypYty9tvv03FihW9jiUiEpBU9MUTycnJjB49mlatWrFu3Tq2b9/udSQRkYDn90X/xx9h1CivU8jp2L59O1dddRVPPPEEPXr0YM2aNdSoUcPrWCIiAc/vB/IlJMA//3idQk5Hz549WbNmDVOnTqVv376aWU9ExEeMtdbrDGelfv1Iu3RpFOXKeZ1ETuXYsWMkJydTtGhRNmzYQHBwMBdffLHXsURE/JIxJtpaG3m67/P77v2wMFTw87mff/6ZZs2acc899wBQt25dFXwREQ/4fdGX/Mtay9SpU2nUqBFbt26la9euXkcSESnQ/L7ob9kCc+Z4nUIyO3jwIL1796Z///40btyYmJgYrrnmGq9jiYgUaH5f9Pfuhe+/9zqFZPb3338zf/58Ro8ezaJFi6hatarXkURECjy/H71frRpce63XKQQgJSWF2bNn07VrV2rUqMHvv/9O6dKlvY4lIiKp/L6lX6ECtGjhdQrZs2cPnTt35sYbb2Tu3LkAKvgiIvmM37f0xXuLFi2iT58+7N+/n/Hjx9O5c2evI4mISBb8vqV/8CD89pvXKQquZ599lvbt21OmTBlWr17NHXfcocl2RETyKb8v+r/+CjNmeJ2i4Lr00ksZMGAAUVFR1K9f3+s4IiJyCn7fvV+yJFx4odcpCpYPPviAv/76iwcffJB27dppGVwRET/h9y39WrWgTx+vUxQMcXFxDBw4kO7duzNnzhySkpK8jiQiIqfB50XfGPOWMeZ7Y8ywk7xeyhjzhTFmgTHmE2NMqK8zyol++OEHIiMjeeutt3j00UdZunQphQr5fUeRiEiB4tOib4y5AQi21jYHahpjamWxWy/gRWtte2AX0NGXGeVE+/fv5/LLL+fAgQMsXLiQsWPHEhIS4nUsERE5Tb5u6bcGPkh9vgC4PPMO1trx1tqFqd+WB/Zk3scYM8gYE2WMiYqOhmefzau4BVt8fDwAZcqUYdq0acTExNC2bVuPU4mIyJnyddEvBmxPff4PUPFkOxpjmgNlrLUrMr9mrZ1orY1MW1YwJSUvohZs3377LRdffDFzUhc26Nq1KxUqVPA4lYiInA1fF/3DQJHU58VPdn5jTFngVeC27A4YEQH/93+5lq/AS05OZtSoUbRq1YrQ0FDNmS8iEkB8XfSjSe/SDwf+zLxD6sC9D4FHrbV/ZXdAY0DjyXLHtm3baNu2LSNGjKBnz56sWbOGyMhIr2OJiEgu8XXRnw30Mca8CHQD1htjxmTa53YgAnjcGPOVMaa7jzMWWEuWLCEqKopp06Yxc+ZMSpYs6XUkERHJRcZa69sTGlMGaAd8ba3ddbbHK1ky0r7zThRdupx9toLo2LFjrFmzhubNm2OtZefOnVSpUsXrWCIicgrGmOi0cW2nw+f36Vtr91trP8iNgg9w6BCsOGGon+TEzz//TLNmzWjXrh179+7FGKOCLyISwPx+Rr7zzoMePbxO4V+stUydOpVGjRqxdetW3nvvPcqXL+91LBERyWN+X/TLlwet85JzycnJ9OnTh/79+9O4cWNiYmK45pprvI4lIiI+oHHvBUxwcDAVKlRg9OjRPProowQHB3sdSSTfOXjwIHv27CExMdHrKFLAhISEUKFChTwbSO33RX/fPtiwAerW9TpJ/pWSksKLL77IFVdcQdOmTXnxxRe9jiSSbx08eJDdu3dTtWpVihQpgjHG60hSQFhriY+PZ/t24HDMzQAAHBVJREFUN4ddXhR+v+/e/+svWLLE6xT51+7du7n66qt58MEHeffdd72OI5Lv7dmzh6pVq1K0aFEVfPEpYwxFixalatWq7Nlzwgz0ucLvW/rnnAN16nidIn9asGABffv2JTY2lgkTJjB48GCvI4nke4mJiRQpUiT7HUXySJEiRfLs0pLfF/3zzwetAXOixYsX06FDB+rWrcuiRYu45JJLvI4k4jfUwhcv5eXfP7/v3pfjJScnA9C6dWuef/55Vq9erYIvIiJAABT9pCRIXQG2wHv//fepW7cuu3btIjg4mKFDh1K0aFGvY4mIx/bt28ctt9xCmTJlqFChAsOHD//3taNHjzJkyBBKlSpFxYoVGTt27L+vjRw5EmMMQUFBVKhQgW7duvHzzz978SNILvH7oh8TA1Onep3CW3FxcQwYMIAePXpQtmxZ3WYkIsfp3r07O3bs4KOPPuLRRx/l6aef5v333wfg3nvvZe7cucycOZNRo0bx5JNP8tFHH/373sqVK7NixQpefvllfvjhB1q0aMGWLVu8+lHkbFlr/fpRqFAjO2WKLbBiYmJs7dq1rTHGPvbYYzYhIcHrSCJ+bcOGDV5HyFWbN2+2gF2zZs2/27p27Wqvvvpqu2PHDhscHGzffffdf1+79dZbbatWray11o4YMcJWr17939d27txpS5QoYYcMGeKr+AVWdn8PgSh7JjXT6w8dZys8HPr39zqFd8aOHUtsbCwLFy6krUY0ikgm//zzD+C6+NM8++yzxMbGsnjxYpKTk2nXrt2/r1166aXMmzcvy2NVqlSJLl26nPR1yf/8vnu/IPrnn3/YunUrAOPHjycmJkYFX0SyVK9ePapVq0a/fv34+OOPsdZy4YUX0qhRIzZt2kSJEiU455xz/t3/1ltvZenSpSc9XoMGDdiyZQvxGkzll1T0/cw333xDw4YNueWWW7DWUrZsWS2WIyInFRYWxmeffUZYWBg33ngjkZGRfP/994Br/Wee9a106dLUq1fvpMcrU6YMAAcOHMi70JJn/L7ob9wIH3/sdYq8l5yczKhRo2jdujVhYWG8/PLLupdYxIeMcY+MunRx2z77LH3bxIlu26BB6dt27HDbMq9c3aiR2x4dnb5t5Ei3beTI9G0ZXz8T4eHhbNq0ifHjx7Njxw5at27N3LlzSUxMJCjIlYEVK1ZgjPn3cTL6vePf/L7oHzkCe/d6nSJv7dmzh7Zt2zJixAhuueUW1qxZQ6NGjbyOJSJ+JDQ0lDvuuIMff/yROnXqMHjwYIoVK0ZcXBzguu3Xrl3LpEmTTnmc/fv3A1CqVKk8zyy5z++Lfu3acP31XqfIW8WKFePIkSNMmzaNGTNmUKJECa8jiRQ41rpHRp995rZ16ZK+bdAgt+3/27v38KjqM4Hj3zchkAssgRASg0JqoEghkkZIBK2CSrn4gC4iIKEQAQEruOgKKAUTLraLbSndSkWohq221CJbQVmQixJLCxrSAGWNFWoENiiEiyIJAULe/eNMhiQEcyGZyUzez/PM48yc23t+HvLO+d3OihWXv4uJcb47erTi9tnZzvflf8Onpzvflb/Tv5bf+CtXrmTQoEHuz+3atWPevHnk5+cTERHBqVOn+OqrrwgNDSUhIYGoqKhv3N/+/fuJjY21OUB8lM8n/bAwqOYa9UnFxcUsWrSIwsJCwsLC2LVrF+PGjfN2WMYYHxMcHMy2bdsqtMGfPHmSkJAQhg8fDsBb5don9u7de9V9FRQUsH79eu739zstP+bzQ/b80ccff8zo0aPZu3cvXbp0YdSoUe52N2OMqY2hQ4fSpk0bRowYwdNPP83x48dJS0tj8uTJxMfH8+CDDzJt2jQAAgMDr3j09oULF8jKyuKf//wnixYtolWrVsyZM8cbp2Lqgc9nks8/h5wcb0dRP1SVV155hVtuuYX8/HzefvttRo0a5e2wjDE+LDw8nK1bt1JaWsrw4cN55plnGDduHIsXLwZg1apVPPjggzz66KOkp6fz2GOPVdj+888/Jzk5mRkzZpCUlMQHH3xgI4Z8mGjlRiofI9JLV67czaRJ3o7k2i1cuJBnn32W/v3789prrxFTuauvMabB5ebm0s2e1228rLrrUESyVbVXbffr89X70dGQkODtKK6NqiIipKSk0Lx5c5566ikCAwO9HZYxxhg/4/PV+x06QK9a/9ZpHEpLS/npT3/KyJEjUVVuvPFGZs+ebQnfGGNMg/D5pO+rjh07xpAhQ5g1axalpaUUFxd7OyRjjDF+zueTflERnDzp7ShqZ/PmzfTs2ZPMzEyWL1/OG2+8QUhIiLfDMsYY4+d8Punn5sK6dd6OouaKiopITU0lIiKCrKwspkyZYtNaGmOM8Qif78gXEgJt23o7iuodOXKEmJgYQkNDeeedd4iLi7MZrYwxxniUz9/pf+c7jX8a3tdff50ePXq4x8XGx8dbwjfGGONxPp/0G7PCwkImTZrE6NGj6d69O2PGjPF2SMYYY5owS/oN5O9//zu9evXilVdeYc6cOWRmZhIbG+vtsIwxxjRhPp/09+2DNWu8HcWVzp07R1FREVu3buW5554jKCjI2yEZY5qYVatWISKICAEBAXTq1ImnnnrK/Tjdhjqmp25wPvvsM/f5VX6tWrXKIzH4Gp/vyHfxojNsrzE4efIk69atY8KECSQlJXHgwAGaN2/u7bCMMU1cVlYWFy5c4MMPP2TevHkcO3aMV1991dth1Zvly5dzS6XnD3/rW9/yUjRX2rNnD9u3b2fGjBneDsX3k358PIwY4e0o4P333yclJYXjx49z1113ERsbawnfGNMo9HJNW9q3b18KCwtZsGABv/nNb2jRooWXI6sfXbt2dZ9jY7Rnzx6WLl3aKJK+z1fvN28OYWHeO35JSQnp6en079+fkJAQdu7caW33xphGKzExkQsXLnDS12Y1M/XC55O+N6kqw4YNY/78+aSkpJCdnU1iYqK3wzLGmKs6duwYIkJERAQA+fn53H///bRu3Zro6GieeOIJSktLgctt5nv27GHEiBG0bNmSm266iZ07d7r399FHH3HbbbcRHBxMnz59yMvLq3C806dPM3bsWFq2bEl0dDTz58+n7Omu/fr1Y8qUKfTu3Zu2bduyYcMG+vTpQ3h4OG+++Wa9nO/58+eZPn06bdu2pU2bNkyfPp3z58+7l2/fvh0R4dKlSyxcuJDY2NgKTR8XL15k9uzZREVFERERQWpqKmfOnHEvP3PmDOPHjycyMpLw8HCGDx9OQUEBAOnp6YgIDz/8MIcOHXL3N0hPT6+Xc6sTVfXpV2TkLbprl3rNq6++qr/97W+9F4Axpl599NFH3g6h3mRkZKjzZ96xf/9+7dq1q95zzz3u7+68807t0aOHbt26Vd944w1t27atZmRkqKpqXl6eAtqjRw+dNm2abtmyRRMTEzUhIUFVVS9evKhdunTRPn366KZNm3TBggUaFBSknTp1cu//+9//vn7729/WdevW6fLly7Vly5b64x//2H3sVq1a6dq1a7Vnz57arFkzzcjI0IEDB+rgwYOrPb+y+N57772rrvPII49odHS0/v73v9fVq1drVFSUTp482b38vffeU0AnT56svXv31l/84heam5vrXj579myNiorS119/Xd9++22Ni4vTUaNGuZdPnz5dY2JidN26dbp+/XqNj4/XSZMmqapqfn6+ZmVlaVpaml533XWalZWlWVlZmp+fX+25VXcdAru1DjnT59v0Cwrgk08gOdkzxysuLmbmzJkkJiby8MMPM3bsWM8c2BjjNbFPb/B2CAB89h/31mm78lN9JyYm8vLLLwPOTd+YMWO47bbb6N69OyUlJSxbtowPPviA1NRU9zbdunXjV7/6FQBz5sxh9OjRgPMckQMHDrBx40bi4uIYOHAgOTk5/O1vfwNgx44dbN68mZycHBJcz0AvKipi3rx5PPnkkwA89NBDDB8+nHXr1hEVFUVqaip5eXlkZmbW+Pz69+9f4XNeXh6xsbEcPnyYl19+mbVr13K/axa3Fi1aMGLECObOncsNN9zg3iY3N5cdO3ZU6It17tw5li5dyksvvcTIkSMBOHHiBI888gjFxcUEBwdz+PBhevbsybBhwwDo0qULp06dAiAmJoaYmBj2799P8+bNG0W/A5+v3u/YEZKSPHOs3NxckpOTeeGFFzh48KBnDmqMMdcoJyeHDRs2ICLMmjWLjh07As6PgZEjR/LOO+9w7733EhUVxfbt2zl37lyF7SdPnux+HxERQUlJCQAHDhygbdu2xMXFuZffcccd7vd79uyhdevW7oQPTpV+YWGh+2/odddd546l/Pva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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,6))\n",
    "plt.plot(fpr,tpr,\"b:\",linewidth=2,label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest,tpr_forest,\"Random Forest\")\n",
    "plt.legend(loc=\"lower right\",fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9920000830492138"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Random比SGD好很多，ROC,AUC的分数也高很多\n",
    "roc_auc_score(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9844366505918457"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度与召回率也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf,X_train,y_train_5,cv=3)\n",
    "precision_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8284449363586054"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 选择合适的指标利用交叉验证来对分类器进行评估\n",
    "   * 选择满足需求的精度/召回率权衡\n",
    "   * 使用ROC曲线和AUC分数比较多个模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多类别分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 尝试5以外的检测\n",
    "   * 多类别分类器区别两个以上类别\n",
    "   * 随机森林和朴素贝叶斯可以直接处理多个类别\n",
    "   * 支持向量机SVM和线性分类器只可以处理二元分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 解决方案"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   1. 将数字图片分类0-9，训练10个二元分类器，每个数字一个，检测一张图片时，获取每个分类器的决策分数，哪个最高属于哪个，称为一对多OvA\n",
    "   2. 为每一对数字训练一个二元分类器，区分0，1区分0，2区分1，2称为一堆OvO策略，存在N个类别，需要N*(N-1)/2个分类器，最后看哪个类别获胜最多"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 优缺点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * OvO只需要用到部分训练集对其必须区分两个类别进行训练\n",
    "   * 对于较小的训练集合OvO比较有优势，大训练集合OvA速度快，所以OvA更常用，比如svm在数据规模扩大时表现糟糕\n",
    "   * sklearn检查到使用二元分类算法进行多类别分类任务，会自动运行OvA，SVM分类器除外"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train,y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-163915.77722013, -538316.99603336, -361030.6768193 ,\n",
       "         -36165.36088947, -441562.99322   ,  -31354.9014713 ,\n",
       "        -828458.45435693, -327086.26328601, -697662.26969863,\n",
       "        -578248.27258845]])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内部实际训练了10个二元分类器，获得图片的决策分数，然后选择了分数最高的类别\n",
    "# 返回10个分数，每个类别一个\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)  # 序列中最大值的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5,tol=-np.infty,random_state=42))\n",
    "ovo_clf.fit(X_train,y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "forest_clf.fit(X_train,y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0. , 0. , 0.1, 0. , 0.9, 0. , 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林直接将实例分为多个类别，调用predict_proba（）可以获得分类器每个实力分类为每个类别的概率列表\n",
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.86142771, 0.86709335, 0.8820323 ])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确率\n",
    "cross_val_score(sgd_clf,X_train,y_train,cv=3,scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.91316737, 0.90884544, 0.91053658])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放，可以得到准确率90%以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf,X_train_scaled,y_train,cv=3,scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目流程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   1. 探索数据准备的选项 \n",
    "   2. 尝试多个模型\n",
    "   3. 选择最佳模型并用GridSearchCV参数进行微调\n",
    "   4. 尽可能自动化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定了一个相对合适的模型，进一步优化，分析其错误类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 查看混淆矩阵\n",
    "   * 使用cross_val_predict()进行预测\n",
    "   * 调用confusion_matrix()\n",
    "   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "C:\\Users\\张佳鑫\\AppData\\Roaming\\Python\\Python37\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5731,    2,   28,   13,    9,   43,   45,    9,   39,    4],\n",
       "       [   1, 6470,   49,   27,    6,   46,    5,   10,  117,   11],\n",
       "       [  57,   33, 5343,   90,   88,   27,   77,   59,  171,   13],\n",
       "       [  51,   35,  139, 5358,    3,  221,   34,   54,  142,   94],\n",
       "       [  24,   24,   31,    7, 5406,   10,   43,   32,   84,  181],\n",
       "       [  74,   38,   38,  185,   78, 4596,  107,   35,  185,   85],\n",
       "       [  31,   24,   50,    1,   43,   94, 5623,    6,   46,    0],\n",
       "       [  23,   20,   69,   31,   55,   12,    5, 5820,   18,  212],\n",
       "       [  47,  149,   77,  154,   13,  145,   54,   27, 5051,  134],\n",
       "       [  39,   35,   30,   88,  187,   32,    2,  202,   81, 5253]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf,X_train_scaled,y_train,cv=3)\n",
    "conf_mx = confusion_matrix(y_train,y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow函数来查看混淆矩阵图像表示\n",
    "plt.matshow(conf_mx,cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 看起来不错，大多数图片都在对角线上，说明他们被正确分类\n",
    "# 数字5看上去比较暗，说明1. 数字5图片较少 2.分类器在数字5上执行效果不如在其他数字上好\n",
    "# 假设把焦点放在错误上，为取得错误率，而不是错误绝对值，需要将混淆矩阵中每个值除以相应类别中图像数量\n",
    "\n",
    "row_sums = conf_mx.sum(axis=1,keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线，只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx,0)\n",
    "plt.matshow(norm_conf_mx,cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每行代表实际类别，每列代表预测类别\n",
    "# 8，9列比较亮，说明许多图片被错误的分类为数字8，9\n",
    "# 类别8，9也偏亮，说明数字8，9经常会与其他数字混淆\n",
    "# 有些很暗，比如行1，大多数数字1都被正确的分类，一些和8混淆\n",
    "# 5和3是错误最多的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 改进数字8和9的分类\n",
    "   * 修正数字3和5的混淆"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 如何优化分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "   * 尝试多收集一些数字的训练集\n",
    "   * 开发一些新特征来改进分类器\n",
    "   * 优化分类器算法\n",
    "   * 使用pillow或opencv对图片预处理，让显示模型更突出\n",
    "   * 分析单个错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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pI4aAL1DOMnJyVi7di0AKbzju+++w3fffUfbfvvttwCA999/34LSFubXX38FAPz0008aviL29vaoWrUqAEmT1a5dO7Rp0wYA8M477+D69esAIFsIjDrJycl0Pq9fv042TV9fX73t8Vl6cRA2R4FAIBAItLCIWnXq1KkAXnhdAsCoUaOwYsUK2Nvby9GEyfCZY0RERKGZpDqenp5W8XI9e/YsudBz+GyxQoUK5FnZv39/dO3alUZ11mLt2rUYM2YMqVR2795t0fZv374NAKhbt67RQeYlSpSgHJYmjjRfabXqzJkz8c0337zYSS0USxtup/X398eUKVNI1aYU3K7Ec4wCkg17yZIlOrevVavWS+eFnJqailOnTtE9+/XXX5Nadffu3VabPUZGRpJXbXZ2NoAXauJx48ZZPG8zAGzevBkTJkzAkydPAEgmMAU0etazOfLYIy8vL1INAkB8fDzZg14WDNkpFbowOnn8+DF69uwJQMreAbxwMY+Li9PY1t3dnWwu7dq1s4h82qxduxa+vr5kHN+5c6dF2//7778BwGQ3cj7guHLliilOEq905+jq6qphY+LviEqVKsHd3R0nT54stE6lUmHo0KHYtGmTnPIWYsKECQCkkAFjcHR0pMxHzZo1g4+Pz0uXAal169bkxNKhQwccPHgQTk5OFmmbMUbq008++YQ6IUdHRzRo0ADHjh2j75aEt8snJJMnTwYgqVLj4+NpO5kyCOl8noVaVSAQCAQCbfQlXWUKJCo+fvy4RrLnLVu2yN2ErISHhzNPT08NmT09PZmnp6dF5UhLS2Px8fEsOTmZJScns+PHjzMfHx/m4+NDcvXo0YP16NHDonKps2bNGgaA1a9fn9WvX9/i7d+7d4/du3ePVa9enalUKtapUyfWqVMnduzYMRYdHU1LaGiozkTPf//9tynNWTuBuKKJxzt27EhJ45s2bcp27NjBduzYwRITE1lubi67evUqu3r1KpsxYwadPxsbG2Zvb88WLlzIFi5caMq5NInY2FgWGxvL1qxZwypXrswqV65sUjEBDw8PlpOTw3JychST0VR++OEHjXsxNDTUYm3v379f4/wcOHCAHThwwGLt62P27Nls9uzZdE64fNqf3d3d2ahRo9ioUaPYo0ePzG3O8onHtVGpVBp2i+DgYAwdOtSSIpgE93bl8ZLqKlf1dGhKU6ZM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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances,images_per_row=10,**options):\n",
    "    size=28\n",
    "    images_per_row = min(len(instances),images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances)-1 )// images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size,size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row+1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages,axis=1))\n",
    "    images = np.concatenate(row_images,axis=0)\n",
    "    plt.imshow(images,cmap = matplotlib.cm.binary,**options)\n",
    "    plt.axis(\"off\")\n",
    "    \n",
    "    \n",
    "# 查看数字3和数字5的例子\n",
    "cl_a,cl_b = 3,5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221);\n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222)\n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223)\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224)\n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因：SGD是一个线性模型，他所做的就是为每个像素分配一个各个类别的权重，当他看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 如果数字3和5在一部分像素位上有区别，所以分类器就容易将其弄混\n",
    "# 通过上面的图像，如果书写3的连接点左移，分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一，就是对图像进行预处理，确保位于中心位置并且没有旋转"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为每个实例产生多个类别，例如照片识别多个人脸\n",
    "# 分类器经过训练可以识别小红，小白，小军，一张照片里有小红小白\n",
    "# 经过分类器，应该输出【1，1，0】，是小红，是小白，不是小军\n",
    "# 输出多个二元标签的分类系统统称为多标签分类系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# K近邻分类器KNN\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large,y_train_odd]  # 矩阵合并\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train,y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]])"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类，不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 评估多标签分类器方法有很多，方法之一就是测量每个标签的F1分数，或者其他二元分类器指标，然后简单平均\n",
    "# y_train_knn_pred = cross_val_predict(knn_clf,X_train,y_multilabel,cv=3)\n",
    "# f1_score(y_multilabel,y_train_knn_pred,average=\"macro\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个等于自身支持的权重（该目标标签实例的数量），设置average=“weighted\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多输出分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例子：构建一个系统去除图片中的噪声，输入一张有噪声的图片，他将输入一张干净的数字图片，分类器输出是多个标签，一个像素一个标签，每个标签多个值0-255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片 创建训练集和测试集\n",
    "noise = np.random.randint(0,100,(len(X_train),784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0,100,(len(X_test),784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAC2CAYAAAD5uGd5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAZtUlEQVR4nO3df2zVV/kH8PezUgZrGaH8cshYYfwaOoqjApUxYXMs+xGjzGQmYkw0YqIhMZnR74SYDPdddJr5TRYlkszFsOgyjUzMMgMoDpQhK8oK0jF+rIyfAwa0lN8tz/cPWkfveR+4t+297bm8X8my9dlzez+f28Ph9p7zPMfcHSIiko4bevoCREQkN5q4RUQSo4lbRCQxmrhFRBKjiVtEJDGauEVEEqOJW0QkMX06+0Azex7AJACvuvtTsbwhQ4b4qFGjOsTOnDlDc2+66aYgduHCBZrbp0/2l3727NkgVl5eTnMvXryYVQwALl26lPV1tbS0BLH+/fsHMXatAGBmQaxfv340t7W1NYixa4254Qb+93nfvn2D2Pnz52luSUlJVjEAOHXqVBBjYwEIX5/3338fjY2N4YvTSdmOa+Dy2K6srOyupxbpoKGhAceOHaNju1MTt5nNA1Di7jVm9iszG+fuO1nuqFGj8I9//KNDbPPmzfT7TpkyJYgdOHCA5lZUVASx2IRTV1cXxGpqamjusWPHgtjBgwdpLptk2XUBwNGjR4NYVVVVENu2bRt9PLu3O+64g+ayifD06dM0lxVglZWV0dyPfvSjQWzv3r00d+DAgUFswIABNPf1118PYuy1AYCtW7d2+HrhwoU0rzNyGdcAUFlZidra2m57fpErVVdXR/9fZz8qmQ3g5bb/XgXg7iv/p5ktMLNaM6tlE6FILzUbVxnXQMexzf4yFimEzk7cZQDa3wofBzD8yv/p7svcvdrdq4cMGdKV6xMppKuOa6Dj2B46dGhBL06kXWc/424G0P4BbTmu8hfAmTNngo9GYr/iNzQ0BLHYZ9xNTU1B7MYbb6S57OOA2Ecw7LPk2GfyY8aMCWInTpyguYMHDw5i7DPqT3/60/Tx7OOE2HMNGzYsiO3Zs4fmDho0KIiNGDGC5u7cGX5q0NzcTHPZZ/qxj0puvfXWIBb7WWauIbCfVxdkPa5FelJnB+ZmfPhrZBWAhm65GpGepXEtSejsO+5XAKw3sxEAHgQwo/suSaTHaFxLEjr1jtvdm3B5IWcjgDnu3tidFyXSEzSuJRWd3sft7ifw4Qq8SFHQuJYUaPFFRCQxnX7Hna1+/fph4sSJHWKNjfw30PHjxwex+vr66PfNNG7cOJrLni+2TfGDDz4IYmyXRszkyZNp/Ny5c0GM7YyJGT16dBCLVWlmFqkAwNixY2kuK5SJVW+yHT6xHSjs5xYrTmL3xqo0gXCMxHafiBQzveMWEUmMJm4RkcRo4hYRSYwmbhGRxOR9cbK1tTXoVscW6gBg//79QSzWpIotRG7cuJHmsrLuWEvU0tLSIMZK2wFgw4YNQYyVtgO86x/r/hVrfcpay8bKzXPpocG+b6xVK+sOyF5b4HJXyEx//vOfae7cuXODWGyMHDp0qMPXsZa7IsVM77hFRBKjiVtEJDGauEVEEqOJW0QkMZq4RUQSk/ddJRcvXgwOLYiVkJ88eTKIsSb7wOVDYjPFdn+wg2dzKRdnhwIAfPcF2xkD8Pt44403glisFJ8dmsBaBADhzguA7wgBgH379gWxI0eO0Fy2C2bLli00l+36eeCBB2ju7t27g1i2r2Muh0aLFAu94xYRSYwmbhGRxGjiFhFJjCZuEZHE5LyyY2Z9AOxp+wcAFrp7uKLXpry8HDNnzuwQi/WhPnjwYBCrqqqiuW+99VYQO3z4MM1lZdFTpkyhuay/85133klzWXl6XV0dzWX9pdlp95s3b6aP/9jHPhbEYu0AWH/r2GnorB8367sde74JEybQ3DNnzgSxo0eP0ly2eBzrCZ75OnbnKe+5jm2RntKZJfnJAH7r7t/r7osR6WEa25KEznxUMgPAI2a2ycyeb3uXIlIMNLYlCZ2ZuN8E8Bl3nwagFMBD3XtJIj1GY1uS0JmJu87d2ys8agEElRZmtsDMas2sNva5pkgvpLEtSejMxL3czKrMrATA5wAEq4Tuvszdq929Opfe0CI9TGNbktCZz/CWAPgNAAOw0t3XXC357NmzwU6L2I6BSZMmBbFdu3bRXFY2P3LkSJr7zjvvBDG2KyVm+/btNM52psTKxVnJ+Q03hH9vxk43Z7nuTnNjhzEw7HvEdqt88MEHQax///40l5X4X7p0KetrmDNnDs1du3Zth69jY6mTchrbIj0l54nb3bfh8uq7SFHR2JZUqABHRCQxmrhFRBKjiVtEJDF5LzDo169fUK6d2Z+7HSv3njZtGs1lpeWx08lZKf2AAQNoLju1PNYjO3OhDAA+9alP0VyGlXpPnsw/YmV9s2OtAxjWzxu43JIgU+zkdFYe/89//pPmskXWm2++meYOHjw4iMUWMjMXhNlrKNId/vCHP9D4vHnzglh9fT3NZW0tuoPecYuIJEYTt4hIYjRxi4gkRhO3iEhiNHGLiCQm77tKWltb0djYGMQYthNh586dNJeVx7MdEgAvqT537hzNZSfNnz59muaycu8nn3yS5rKG/2VlZUHsxRdfpI9nBynEemWsXr06q+cC+E6Pfv360dzMnyMAHD9+nOb+6U9/CmJ79uwhmcCsWbOyui4AmD9/foevY4c+SPf72c9+RuM7duzI6vErVqyg8YkTJwax2G6M119/PevnZ3/uYwdvdDWXteAAgIqKiqxz2b3F6B23iEhiNHGLiCRGE7eISGI0cYuIJCbvi5PuHiwgxcqZR4wYQR/PbNmyJYjdf//9NJctoLFTyIHcToR/9dVXg9imTZtoLitPZ6X0lZWV9PHNzc1BbP/+/TSX3Rvr5w3wRdpYj+sxY8YEsdgCDlu4fe6552gua1XAFiyBsDd6bCxJ17By78cff5zmsjGQy2Lf+vXrg9jf//53mpvL92W6I/eee+4JYs8++yzNZX/GYy00cqF33CIiidHELSKSGE3cIiKJ0cQtIpIYTdwiIonJaleJmQ0H8Ht3n9X29fMAJgF41d2futpjz507F5yyPnz4cJrLDlj4yEc+QnPZqensIAaA77KIlVTfcsstQSx2YAErUY3tKmG7JNjBBKzkHuAlwC0tLVnnxg54YK8jO80dAD75yU8GsVjJe01NTRB7//33ae7bb78dxI4cOUJzM0+PZ20SctGVsV3MWHl6bIcXM3Xq1C49f6zkne3IYCXzuX7f2C6m3uqa77jNbBCAXwMoa/t6HoASd68BMMbMxuX3EkXyQ2NbUpXNRyWtAB4D0P62czaAl9v+exWAu7v/skQKQmNbknTNidvdm9z9yrZwZQDaP9M4DiD43MPMFphZrZnVso5yIr1BV8f20aNHC3GZIoHOLE42A2gviytn38Pdl7l7tbtXs89xRXqpnMZ2rK2uSL51puR9My7/CrkRQBWAqzbjLSsrQ3V1dYdY7DT2Q4cOBbFY+XXm9wSAv/zlLzSX9ZcuLS2luWzhlC2eAfx6Y6fSs0WRz372s0Esttg2cuTIIMbK4AF+Uj1rJwAAW7duDWIzZ86kubt37w5irLQd4C0JYifNs59F7Hoz7zmXEuYs5DS2i0HstwZWch57rRcvXhzElixZ0rULk6vqzMT9CoD1ZjYCwIMAZnTvJYn0GI1tSULWH5W4++y2fzfh8iLORgBzMj4jFEmOxrakplPdAd39BD5cfRcpGhrbkgJVToqIJEYTt4hIYvJ+kAIQNvGPlUmzE7tZCToAnDp1KoixkmwA2LBhQxCLnXr+xz/+MYj94Ac/oLmsLJud6gzwU9rZ/cZ2pbBy8Vg7ALbbJbb7g+24iZ1qP3369CC2Zs0amjtq1KggNm4cL0Rk7QfYrhQg/Bl3teT9elJfXx/E5s2bR3P37t0bxGIHALBdSOy5YuXmkju94xYRSYwmbhGRxGjiFhFJjCZuEZHEFGRxMrNvdGyR4/bbbw9iBw8epLl1dXVB7BOf+ATNZc/Hen8D/CTrWE+KwYMHB7F3332X5n7rW98KYqwXNlscBfhJ87GFwZKSkiAW693NTnlvbW2luex+2eImEPbNBuJ9vlnZdexU+syf28WLF2ne9SxWxv7QQw8FMbYICfDy9mPHjmX9fdni9Jtvvkkf3x2nnl9v9I5bRCQxmrhFRBKjiVtEJDGauEVEEpP3xUkzC/otxxaeWLXcnXfeSXN37twZxPr04bfDDvt97733aC47EDW2QMqqL2M9i2+88cYgxqohv/KVr9DHs0VTtrgZu67YgceTJk0KYmxxEwBqa2uDWKx6ky3SxqpVWbVpZWUlzd21a1eHr2OLrtez2NhmC5G5HACcS25DQ0MQGzZsGM3929/+FsTuueeerJ/reqR33CIiidHELSKSGE3cIiKJ0cQtIpIYTdwiIonJaleJmQ0H8Ht3n2VmfQDsafsHABa6e3hUeJtLly4FZdWHDx+muWznRaykmfW3jpWxsz7QsfJd1v/75MmTNHfq1KlBbOnSpTSX7X5YsWJFEGO7ZQDgpZdeCmJf+MIXaC7rsbx9+3aay+KxvubsdTx//jzNZeXtsfJ4tgsitoMhs/Q/9j2z1ZWxnZrYjifm0UcfDWJPPPFE1o9ft25dEPvRj35Ec9lOqtdee43mTpw4MetrKGbXnLjNbBCAXwNo38s1GcBv3f17+bwwkXzT2JZUZfNRSSuAxwC0bwSeAeARM9tkZs+3vUsRSZHGtiTpmhO3uze5e+MVoTcBfMbdpwEoBRC0BjOzBWZWa2a1sY8kRHpaV8d2rAufSL51ZnGyzt3bDzWsBRB88Onuy9y92t2r1bJREpLT2I61+xXJt878KrjczP4XwDYAnwPw9NWSW1pagoXA8vJymstK4WM9nNlfCLFFz9GjRwexWCn9M888E8RiC2CsPzV7LgDYujVc4/rJT34SxJqbm+njx44dG8Rihy6zMvSbbrqJ5rJ4rG8yuzfWzxsABgwYEMRiryP7uccOAb506RKNd5OcxnZvxRbNgXif9Xy46667gti3v/1tmstK4VkrBoC3ibge/wLtzMS9BMBvABiAle7Ou/mLpEdjW5KQ9cTt7rPb/r0Nl1ffRYqCxrakRgU4IiKJ0cQtIpIYTdwiIonJe4HB+fPnsWfPng6x2I6BO+64gz6eYaXwjY2NJJOvRMd2ZLDTqWPXe+HChSAW2/Vw2223BbF9+/YFsfHjx9PHb9q0KYjdd999NPfpp8PNED/+8Y9pLmszMGLECJrLDqoYM2YMzWU/i9gBGmxXQewwh8x4LmXc0jux8vaHH36Y5rIT5WPl8cW8FVnvuEVEEqOJW0QkMZq4RUQSo4lbRCQxeV+c7Nu3L0aOHNkhxsqhAaB///5B7J133qG5mSfHA/E+0qwZEHsugC/AsdOxAV7uzfp5A3yxjTXgip3Gzk50/+Y3v0lz16wJC/7YQigATJgwIevcs2fPBrHYQua///3vIMYWcwFg4MCBQSy2kJnZp/v06dM0T9LBSvSXLFlCc7/xjW8EsRdffJHmxkrsi4HecYuIJEYTt4hIYjRxi4gkRhO3iEhiNHGLiCQm77tKWlpagvLyWDkza+qfy06RhoYGmrt///4gxkrbAWDQoEFZPR7gBynU1dXR3MrKyiDGTjKP7XZhu2hi5fU7duwIYps3b6a57ECJiooKmssOUoi1DmBN+ydP5h1Tt23bFsSGDx9Oc2+99dYOX3f1lHfpnd5++20aZy0O2HgvdnrHLSKSGE3cIiKJ0cQtIpIYTdwiIom55uKkmQ0E8BKAEgCnATwGYCmASQBedfenrvb4srIyVFdXd4jt3LmT5r711ltBbMqUKTSXlaHHenezBc7t27fTXFaGPn36dJrLTqA/deoUzWXl3mxxMnZd3/nOd4LYqlWraC475f2RRx6huayfduw08I0bNwYx1kMd4Ius5eXlNDfWg5ypr6/v8HXslPlr6eq4ltxl/uzaLVq0KIi98sorNJdtYJg7d27XLixB2bzj/hKAZ919LoDDAL4IoMTdawCMMbNx+bxAkTzRuJZkXfMdt7v/4oovhwKYD+D/2r5eBeBuAPwttEgvpXEtKcv6M24zqwEwCMA+AAfawscBBBtuzWyBmdWaWS3bby3SW+QyrtvyNbalx2U1cZtZBYDnAHwVQDOA9g8wy9n3cPdl7l7t7tVDhw7trmsV6Va5jmtAY1t6h2tO3GbWF8DvADzh7nsBbMblXyMBoApAQ96uTiRPNK4lZdmUvH8NwF0AFpnZIgAvAPiymY0A8CCAGVd7sJkFp6THmt/PmBF+q1jzfWbWrFk0nnnKPAD8/Oc/p7nf/e53gxg7YR3gp7+z0+cB4ODBg0Fs5cqVQSy2mp5Z6g0A9957L82dOXNmEIudeP3uu+8GsbFjx9LclpaWIBY7ZX3atGlBrLm5meaWlZUFMXa4AhDuTGGn1GepS+O6N3vqKb4hZvHixXl5PrZb5Omnnw5isbHN5oPYuPr+978fxD7/+c9f6xKLTjaLk0txeZvUf5nZSgD3A3jG3RvzdG0ieaNxLSnrVJMpdz8B4OVuvhaRHqVxLalQ5aSISGI0cYuIJCbv/bibmpqC0uxYz+l//etfQSy2qMb6SB86dIjmsp7NbGERAF544YUgxspsAeDkyZNBbPny5TSXndLOYrHFNtafeuHChTT3vvvuC2KxnuJsIXLt2rU09/bbbw9isYVb1is81r6AnR5/4MABkgmcOXOmw9exNgfXs9jP+tFHHw1isT9fbHHwl7/8Zda5rJ1DbMGR/fmK/Tm6HhciGb3jFhFJjCZuEZHEaOIWEUmMJm4RkcRo4hYRSUzed5X06dMHw4YN6xCLnbDOmuKzU9cBXgofWyFnuz8ef/xxmjt79uwg9vGPf5zmslPlczk9vra2NojFyvZ/+tOfZvX8ALB169YgFtvJww5uiDVPYq/5pEmTaC47zCF2gAbT1NRE45k7U2L3dT37+te/TuMPP/xwEDty5AjNZTtAYrtCYvFMbFcLAPzwhz8MYhMnTszqe16v9I5bRCQxmrhFRBKjiVtEJDGauEVEEpP3xcnS0lLccsstHWLsNHcAqKqqCmLvvfcezW1sDLtuxvp8s+/LSshj1xY7TZ31jF63bh3NnT9/fhBjC3AlJSX08aNHjw5iscVY1jc7dvo8K02PnfLO+prHTnlnC6+lpaU0l91HZml7u8ye3rFrvZ5NnTqVxg8fPhzEli1b1uXnY2Mgtsgu3UPvuEVEEqOJW0QkMZq4RUQSo4lbRCQx11ycNLOBAF4CUALgNIDHAOwC0L5StdDdw1I9kV5M41pSls2uki8BeNbdV5vZUgD/A+C37v69bJ6gtbU12NEQa6jPdlnEdk6w0vIdO3bQXHaKeKwB/8033xzE5syZk3VurFSXHULASvxjJchr1qwJYtXV1TR3wIABQezEiRM0l5Wmx3agsJ/bli1baC57HSorK2kuO7iB7aIBELRPiO1UyUKXxnWxWLBgQU9fgnTCNT8qcfdfuPvqti+HAmgB8IiZbTKz580s71sKRbqbxrWkLOvPuM2sBsAgAKsBfMbdpwEoBfAQyV1gZrVmVht7pyfSG+Qyrtvy/zu2jx49WsArFflQVhO3mVUAeA7AVwHUuXv74Y61AMZl5rv7MnevdvfqWHc/kZ6W67gGOo7tWBdFkXy75sRtZn0B/A7AE+6+F8ByM6sysxIAnwPAyyBFejGNa0lZNp/jfQ3AXQAWmdkiAGsBLAdgAFa6e7hqdoWSkpJgEa++vp7mskXEffv20dyampogduzYMZr7n//8J4ixU6gBXgof6w3NFkPvvfdemvvXv/41iE2fPj2IsUVMgC/GsgVLAHjggQeC2ODBg2kuax0Q66+8e/fuINanDx9Ce/fuDWKx9gXjx48PYpml7e0yF0NjpfFZ6NK4FulJ15y43X0pgKUZ4SfzczkihaFxLSlTAY6ISGI0cYuIJEYTt4hIYjRxi4gkJu/VYRcuXAhOI6+oqKC57MTu2F5ZtsMhVh5/ww3h30+s3BzgZezl5eU0d+zYsUFsw4YNNHfChAlBjN0vO9gA4KXdscMg2Pdg9wUA27ZtC2KxwwliDfoZthOHldcDfGdKrOz+wIEDHb5mP1uRYqdRLyKSGE3cIiKJ0cQtIpIYTdwiIomxWOl3tz2B2VEA7fXPQwDwuvS0Fet9Ab3/3m5z9x7p9qSxnbQU7is6tvM+cXd4MrNad+fd/xNWrPcFFPe9dadifZ10X72TPioREUmMJm4RkcQUeuJeVuDnK5RivS+guO+tOxXr66T76oUK+hm3iIh0nT4qERFJjCZuEZHEFGziNrPnzewNM1tcqOfMJzMbbmbrr/g6+fszs4Fm9pqZrTKzFWbWtxjuK5+K8fXR2O79CjJxm9k8ACXuXgNgjJnRE7RTYWaDAPwaQFnb18Vyf18C8Ky7zwVwGMAXURz3lRdF9HP/L43tNBTqHfdsAC+3/fcqAHcX6HnzpRXAYwDae5fORhHcn7v/wt1Xt305FMB8FMF95dFsFN/ro7GdgEJN3GUA2hspHwfAG0knwt2b3P3K49GL6v7MrAbAIAD7UET3lQdF9XMHNLZTUaiJuxlA+6kB5QV83kIpmvszswoAzwH4KorovvLkenh9iuYei2lsF+piN+PDX0WqADQU6HkLpSjuz8z6AvgdgCfcfS+K5L7y6Hp4fYriHottbOf96LI2rwBYb2YjADwIYEaBnrdQiuX+vgbgLgCLzGwRgBcAfLkI7itfiuXnfjXFco9FNbYLVjnZtlp9P4B17n64IE9aQMV6f8V6X93lenh9ivUeU74vlbyLiCQmqQ/kRUREE7eISHI0cYuIJEYTt4hIYjRxi4gk5v8B0MyRAT9eqOEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod,y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 垃圾邮件分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "SPAM_PATH = os.path.join(\"datasets\",\"spam\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "HAM_DIR = os.path.join(SPAM_PATH,\"easy_ham\")\n",
    "SPAM_DIR = os.path.join(SPAM_PATH,\"spam\")\n",
    "ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]\n",
    "spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 我们可以使用python的“email\"模块解析这些电子邮件\n",
    "import email\n",
    "import email.policy\n",
    "\n",
    "def load_email(is_spam,filename,spam_path=SPAM_PATH):\n",
    "    directory = \"spam\" if is_spam else \"easy_ham\"\n",
    "    with open(os.path.join(spam_path,directory,filename),\"rb\") as f:\n",
    "        return email.parser.BytesParser(policy=email.policy.default).parse(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Martin A posted:\n",
      "Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the\n",
      " limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the\n",
      " Mount Athos monastic community, was ideal for the patriotic sculpture. \n",
      " \n",
      " As well as Alexander's granite features, 240 ft high and 170 ft wide, a\n",
      " museum, a restored amphitheatre and car park for admiring crowds are\n",
      "planned\n",
      "---------------------\n",
      "So is this mountain limestone or granite?\n",
      "If it's limestone, it'll weather pretty fast.\n",
      "\n",
      "------------------------ Yahoo! Groups Sponsor ---------------------~-->\n",
      "4 DVDs Free +s&p Join Now\n",
      "http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM\n",
      "---------------------------------------------------------------------~->\n",
      "\n",
      "To unsubscribe from this group, send an email to:\n",
      "forteana-unsubscribe@egroups.com\n",
      "\n",
      " \n",
      "\n",
      "Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/\n"
     ]
    }
   ],
   "source": [
    "# 让我们看看一个ham示例和一个spam示例 了解数据的外观：\n",
    "ham_emails = [load_email(is_spam=False,filename=name) for name in ham_filenames]\n",
    "spam_emails = [load_email(is_spam=True,filename=name) for name in spam_filenames]\n",
    "print(ham_emails[1].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help wanted.  We are a 14 year old fortune 500 company, that is\n",
      "growing at a tremendous rate.  We are looking for individuals who\n",
      "want to work from home.\n",
      "\n",
      "This is an opportunity to make an excellent income.  No experience\n",
      "is required.  We will train you.\n",
      "\n",
      "So if you are looking to be employed from home with a career that has\n",
      "vast opportunities, then go:\n",
      "\n",
      "http://www.basetel.com/wealthnow\n",
      "\n",
      "We are looking for energetic and self motivated people.  If that is you\n",
      "than click on the link and fill out the form, and one of our\n",
      "employement specialist will contact you.\n",
      "\n",
      "To be removed from our link simple go to:\n",
      "\n",
      "http://www.basetel.com/remove.html\n",
      "\n",
      "\n",
      "4139vOLW7-758DoDY1425FRhM1-764SMFc8513fCsLl40\n"
     ]
    }
   ],
   "source": [
    "print(spam_emails[6].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 电子邮件实际上有很多部分，带有图像和附件（它们可以有自己的附件）。查看邮件的各种类型的结构：\n",
    "def get_email_structure(email):\n",
    "    if isinstance(email,str):\n",
    "        return email\n",
    "    payload = email.get_payload()\n",
    "    if isinstance(payload,list):\n",
    "        return\"multipart({})\".format(\", \".join([\n",
    "            get_email_structure(sub_email)\n",
    "            for sub_email in payload\n",
    "        ]))\n",
    "    else:\n",
    "        return email.get_content_type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({1: 1, 4: 2, 2: 3, 3: 2})"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import Counter\n",
    "a = [1,4,2,3,2,3,4,2]\n",
    "\n",
    "b = Counter(a)     # 求数组中每个数字出现了几次\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "def structures_counter(emails):\n",
    "    structures = Counter()\n",
    "    for email in emails:\n",
    "        structure = get_email_structure(email)\n",
    "        structures[structure] +=1\n",
    "    return structures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 2408),\n",
       " ('multipart(text/plain, application/pgp-signature)', 66),\n",
       " ('multipart(text/plain, text/html)', 8),\n",
       " ('multipart(text/plain, text/plain)', 4),\n",
       " ('multipart(text/plain)', 3),\n",
       " ('multipart(text/plain, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, text/enriched)', 1),\n",
       " ('multipart(text/plain, application/ms-tnef, text/plain)', 1),\n",
       " ('multipart(multipart(text/plain, text/plain, text/plain), application/pgp-signature)',\n",
       "  1),\n",
       " ('multipart(text/plain, video/mng)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain))', 1),\n",
       " ('multipart(text/plain, application/x-pkcs7-signature)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), text/rfc822-headers)',\n",
       "  1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), multipart(multipart(text/plain, application/x-pkcs7-signature)))',\n",
       "  1),\n",
       " ('multipart(text/plain, application/x-java-applet)', 1)]"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(ham_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 218),\n",
       " ('text/html', 183),\n",
       " ('multipart(text/plain, text/html)', 45),\n",
       " ('multipart(text/html)', 20),\n",
       " ('multipart(text/plain)', 19),\n",
       " ('multipart(multipart(text/html))', 5),\n",
       " ('multipart(text/plain, image/jpeg)', 3),\n",
       " ('multipart(text/html, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, application/octet-stream)', 1),\n",
       " ('multipart(text/html, text/plain)', 1),\n",
       " ('multipart(multipart(text/html), application/octet-stream, image/jpeg)', 1),\n",
       " ('multipart(multipart(text/plain, text/html), image/gif)', 1),\n",
       " ('multipart/alternative', 1)]"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(spam_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Return-Path : <12a1mailbot1@web.de>\n",
      "Delivered-To : zzzz@localhost.spamassassin.taint.org\n",
      "Received : from localhost (localhost [127.0.0.1])\tby phobos.labs.spamassassin.taint.org (Postfix) with ESMTP id 136B943C32\tfor <zzzz@localhost>; Thu, 22 Aug 2002 08:17:21 -0400 (EDT)\n",
      "Received : from mail.webnote.net [193.120.211.219]\tby localhost with POP3 (fetchmail-5.9.0)\tfor zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:17:21 +0100 (IST)\n",
      "Received : from dd_it7 ([210.97.77.167])\tby webnote.net (8.9.3/8.9.3) with ESMTP id NAA04623\tfor <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:09:41 +0100\n",
      "From : 12a1mailbot1@web.de\n",
      "Received : from r-smtp.korea.com - 203.122.2.197 by dd_it7  with Microsoft SMTPSVC(5.5.1775.675.6);\t Sat, 24 Aug 2002 09:42:10 +0900\n",
      "To : dcek1a1@netsgo.com\n",
      "Subject : Life Insurance - Why Pay More?\n",
      "Date : Wed, 21 Aug 2002 20:31:57 -1600\n",
      "MIME-Version : 1.0\n",
      "Message-ID : <0103c1042001882DD_IT7@dd_it7>\n",
      "Content-Type : text/html; charset=\"iso-8859-1\"\n",
      "Content-Transfer-Encoding : quoted-printable\n"
     ]
    }
   ],
   "source": [
    "# 正常邮件纯文本偏多，垃圾邮件相当多的HTML\n",
    "# 查看邮件头\n",
    "for header,value in spam_emails[0].items():\n",
    "    print(header,\":\",value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Life Insurance - Why Pay More?'"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 里面有很多很有用的信息，比如收件人大的电子邮件地址（12a1mailbot1@web.de>）看起来很可疑，\n",
    "# 查看主题标题\n",
    "\n",
    "spam_emails[0][\"Subject\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拆分训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = np.array(ham_emails + spam_emails)\n",
    "y = np.array([0] * len(ham_emails) + [1] * len(spam_emails))\n",
    "\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 首先需要一个函数来将HTML转换为纯文本，使用Beautifulsoup库，下面的函数首先删除<head>部分，然后将所有<a>标记转换为单词hyperlink,然后去掉所有HTML标记，只留下纯文本，为了可读性，他还用了一个换行符替换多个换行符，最后它取消了HTML实体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "from html import unescape\n",
    "\n",
    "def html_to_plain_text(html):\n",
    "    text = re.sub('<head.*?>.*?</head>','',html,flags=re.M| re.S| re.I)\n",
    "    text = re.sub('<a\\s.*?>', 'HYPERLINK',text,flags=re.M| re.S| re.I)\n",
    "    text = re.sub('<.*?>','',text,flags=re.M| re.S)\n",
    "    text = re.sub(r'(\\s*\\n)+','\\n',text,flags=re.M| re.S)\n",
    "    return unescape(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<HTML><HEAD><TITLE></TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\"><STYLE>A:link {TEX-DECORATION: none}A:active {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {COLOR: #0033ff; TEXT-DECORATION: underline}</STYLE><META content=\"MSHTML 6.00.2713.1100\" name=\"GENERATOR\"></HEAD>\n",
      "<BODY text=\"#000000\" vLink=\"#0033ff\" link=\"#0033ff\" bgColor=\"#CCCC99\"><TABLE borderColor=\"#660000\" cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\"><TR><TD bgColor=\"#CCCC99\" valign=\"top\" colspan=\"2\" height=\"27\">\n",
      "<font size=\"6\" face=\"Arial, Helvetica, sans-serif\" color=\"#660000\">\n",
      "<b>OTC</b></font></TD></TR><TR><TD height=\"2\" bgcolor=\"#6a694f\">\n",
      "<font size=\"5\" face=\"Times New Roman, Times, serif\" color=\"#FFFFFF\">\n",
      "<b>&nbsp;Newsletter</b></font></TD><TD height=\"2\" bgcolor=\"#6a694f\"><div align=\"right\"><font color=\"#FFFFFF\">\n",
      "<b>Discover Tomorrow's Winners&nbsp;</b></font></div></TD></TR><TR><TD height=\"25\" colspan=\"2\" bgcolor=\"#CCCC99\"><table width=\"100%\" border=\"0\"  ...\n"
     ]
    }
   ],
   "source": [
    "html_spam_emails = [email for email in X_train[y_train==1]\n",
    "                   if get_email_structure(email)==\"text/html\"]\n",
    "sample_html_spam = html_spam_emails[7]\n",
    "print(sample_html_spam.get_content().strip()[:1000],\"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Watch for analyst \"Strong Buy Recommendations\" and several advisory newsletters picking CBYI.  CBYI has filed to be traded on the OTCBB, share prices historically INCREASE when companies get listed on this larger trading exchange. CBYI is trading around 25 cents and should skyrocket to $2.66 - $3.25 a share in the near future.\n",
      "Put CBYI on your watch list, acquire a position TODAY.\n",
      "REASONS TO INVEST IN CBYI\n",
      "A profitable company and is on track to beat ALL earnings estimates!\n",
      "One of the FASTEST growing distributors in environmental & safety equipment instruments.\n",
      "Excellent management team, several EXCLUSIVE contracts.  IMPRESSIVE client list including the U.S. Air Force, Anheuser-Busch, Chevron Refining and Mitsubishi Heavy Industries, GE-Energy & Environmental Research.\n",
      "RAPIDLY GROWING INDUSTRY\n",
      "Industry revenues exceed $900 million, estimates indicate that there could be as much as $25 billi ...\n"
     ]
    }
   ],
   "source": [
    "print(html_to_plain_text(sample_html_spam.get_content())[:1000],\"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 编写一个函数她以电子邮件为输入，并以纯文本形式返回其内容，无论其格式是什么\n",
    "def email_to_text(email):\n",
    "    html = None\n",
    "    for part in email.walk():\n",
    "        ctype = part.get_content_type()\n",
    "        if not ctype in (\"text/plain\",\"text/html\"):\n",
    "            continue\n",
    "        try:\n",
    "            content = part.get_content()\n",
    "        except:  #解决编码问题\n",
    "            content = str(part.get_payload())\n",
    "        if ctype == \"text/plain\":\n",
    "            return content\n",
    "        else:\n",
    "            html = content\n",
    "    if html:\n",
    "        return html_to_plain_text(html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Wat ...\n"
     ]
    }
   ],
   "source": [
    "print(email_to_text(sample_html_spam)[:100],\"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computations => comput\n",
      "Computation => comput\n",
      "Computing => comput\n",
      "Computed => comput\n",
      "Compute => comput\n",
      "Compulsive => compuls\n"
     ]
    }
   ],
   "source": [
    "# 安装自然语言工具包nltk\n",
    "# 用url 替换 url的方法\n",
    "#pip install urlextract\n",
    "import nltk\n",
    "from urlextract import URLExtract\n",
    "\n",
    "try:\n",
    "    import nltk\n",
    "    \n",
    "    stemmer = nltk.PorterStemmer()\n",
    "    for word in (\"Computations\",\"Computation\",\"Computing\",\"Computed\",\"Compute\",\"Compulsive\"):\n",
    "        print(word,\"=>\",stemmer.stem(word))\n",
    "except ImportError:\n",
    "    print(\"Error:stemming requires the NLTK module.\")\n",
    "    stemmer = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将所有处理整合到一个转换器中，我们将使用它将电子邮件转换为文字计数器，注意，我们使用python的split（)方法将句子拆分成单词，该方法使用空格作为单词边界，但例如，汉语和日语脚本通常不在单词之间使用空格在这个练习中没关系，因为数据集（主要）是英文的，中文可以使用结巴分词来进行拆分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "class EmailToWordCounterTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, strip_headers=True, lower_case=True, remove_punctuation=True,\n",
    "                 replace_urls=True, replace_numbers=True,  stemming=True):\n",
    "        self.strip_headers = strip_headers\n",
    "        self.lower_case = lower_case\n",
    "        self.remove_punctuation = remove_punctuation\n",
    "        self.replace_urls = replace_urls\n",
    "        self.replace_numbers = replace_numbers\n",
    "        self.stemming = stemming\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        X_transformed = []\n",
    "        for email in X:\n",
    "            text = email_to_text(email) or \"\"\n",
    "            if self.lower_case:\n",
    "                text = text.lower()\n",
    "            if self.replace_urls:\n",
    "                extractor = URLExtract()\n",
    "                urls = list(set(extractor.find_urls(text)))\n",
    "                urls.sort(key=lambda url: len(url), reverse=True)\n",
    "                for url in urls:  # 替换url 为 ‘URL’\n",
    "                    text = text.replace(url, \" URL \")\n",
    "            if self.replace_numbers:  # 替换数字\n",
    "                text = re.sub(r'\\d+(?:\\.\\d*(?:[eE]\\d+))?', 'NUMBER', text)\n",
    "            if self.remove_punctuation:  # 删除标点符号\n",
    "                text = re.sub(r'\\W+', ' ', text, flags=re.M)\n",
    "            word_counts = Counter(text.split())   # 统计单词出现次数\n",
    "            if self.stemming and stemmer is not None:\n",
    "                stemmed_word_counts = Counter()\n",
    "                for word, count in word_counts.items():\n",
    "                    stemmed_word = stemmer.stem(word)\n",
    "                    stemmed_word_counts[stemmed_word] += count\n",
    "                word_counts = stemmed_word_counts\n",
    "            X_transformed.append(word_counts)\n",
    "        return np.array(X_transformed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([Counter({'chuck': 1, 'murcko': 1, 'wrote': 1, 'stuff': 1, 'yawn': 1, 'r': 1}),\n",
       "       Counter({'the': 11, 'of': 9, 'and': 8, 'all': 3, 'christian': 3, 'to': 3, 'by': 3, 'jefferson': 2, 'i': 2, 'have': 2, 'superstit': 2, 'one': 2, 'on': 2, 'been': 2, 'ha': 2, 'half': 2, 'rogueri': 2, 'teach': 2, 'jesu': 2, 'some': 1, 'interest': 1, 'quot': 1, 'url': 1, 'thoma': 1, 'examin': 1, 'known': 1, 'word': 1, 'do': 1, 'not': 1, 'find': 1, 'in': 1, 'our': 1, 'particular': 1, 'redeem': 1, 'featur': 1, 'they': 1, 'are': 1, 'alik': 1, 'found': 1, 'fabl': 1, 'mytholog': 1, 'million': 1, 'innoc': 1, 'men': 1, 'women': 1, 'children': 1, 'sinc': 1, 'introduct': 1, 'burnt': 1, 'tortur': 1, 'fine': 1, 'imprison': 1, 'what': 1, 'effect': 1, 'thi': 1, 'coercion': 1, 'make': 1, 'world': 1, 'fool': 1, 'other': 1, 'hypocrit': 1, 'support': 1, 'error': 1, 'over': 1, 'earth': 1, 'six': 1, 'histor': 1, 'american': 1, 'john': 1, 'e': 1, 'remsburg': 1, 'letter': 1, 'william': 1, 'short': 1, 'again': 1, 'becom': 1, 'most': 1, 'pervert': 1, 'system': 1, 'that': 1, 'ever': 1, 'shone': 1, 'man': 1, 'absurd': 1, 'untruth': 1, 'were': 1, 'perpetr': 1, 'upon': 1, 'a': 1, 'larg': 1, 'band': 1, 'dupe': 1, 'import': 1, 'led': 1, 'paul': 1, 'first': 1, 'great': 1, 'corrupt': 1}),\n",
       "       Counter({'url': 4, 's': 3, 'group': 3, 'to': 3, 'in': 2, 'forteana': 2, 'martin': 2, 'an': 2, 'and': 2, 'we': 2, 'is': 2, 'yahoo': 2, 'unsubscrib': 2, 'y': 1, 'adamson': 1, 'wrote': 1, 'for': 1, 'altern': 1, 'rather': 1, 'more': 1, 'factual': 1, 'base': 1, 'rundown': 1, 'on': 1, 'hamza': 1, 'career': 1, 'includ': 1, 'hi': 1, 'belief': 1, 'that': 1, 'all': 1, 'non': 1, 'muslim': 1, 'yemen': 1, 'should': 1, 'be': 1, 'murder': 1, 'outright': 1, 'know': 1, 'how': 1, 'unbias': 1, 'memri': 1, 'don': 1, 't': 1, 'html': 1, 'rob': 1, 'sponsor': 1, 'number': 1, 'dvd': 1, 'free': 1, 'p': 1, 'join': 1, 'now': 1, 'from': 1, 'thi': 1, 'send': 1, 'email': 1, 'egroup': 1, 'com': 1, 'your': 1, 'use': 1, 'of': 1, 'subject': 1})],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在一些邮件上 测试 转换器\n",
    "X_few = X_train[:3]\n",
    "X_few_wordcounts = EmailToWordCounterTransformer().fit_transform(X_few)\n",
    "X_few_wordcounts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 有了单词计数，我们需要把它们转换成向量。为此，我们将构建另一个转换器，其“fit（）”方法将构建词汇表（最常用单词的有序列表），其“transform（）”方法将使用词汇表将单词计数转换为向量--稀疏矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "\n",
    "class WordCounterToVectorTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, vocabulary_size = 1000):\n",
    "        self.vocabulary_size = vocabulary_size  # 词汇量\n",
    "    def fit(self, X, y = None):\n",
    "        total_count = Counter()\n",
    "        for word_count in X:\n",
    "            for word, count in word_count.items():\n",
    "                total_count[word] += min(count, 10) \n",
    "        most_common = total_count.most_common()[:self.vocabulary_size]\n",
    "        self.most_common_ = most_common\n",
    "        self.vocabulary_ = {word: index + 1 for index, (word, count) in enumerate(most_common)}\n",
    "        return self\n",
    "    def transform(self, X, y = None):\n",
    "        rows = []\n",
    "        cols = []\n",
    "        data = []\n",
    "        for row, word_count in enumerate(X):\n",
    "            for word, count in word_count.items():\n",
    "                rows.append(row) # 训练集 实例个数\n",
    "                cols.append(self.vocabulary_.get(word, 0)) # 取得单词在词汇表中的索引位置，0代表未出现在词汇表中\n",
    "                data.append(count)\n",
    "        return csr_matrix((data, (rows, cols)), shape=(len(X), self.vocabulary_size + 1)) # 输出稀疏矩阵 +1因为第一列要显示未出现在词汇表中的单词统计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  (0, 0)\t1\n",
      "  (0, 1)\t0\n",
      "  (0, 2)\t1\n",
      "  (1, 0)\t0\n",
      "  (1, 1)\t1\n",
      "  (1, 2)\t1\n",
      "  (2, 0)\t1\n",
      "  (2, 1)\t1\n",
      "  (2, 2)\t0\n",
      "[[1 0 1]\n",
      " [0 1 1]\n",
      " [1 1 0]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 1],\n",
       "       [0, 1, 1],\n",
       "       [1, 1, 0]], dtype=int32)"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "from scipy.sparse import *\n",
    " \n",
    "row =  [0,0,0,1,1,1,2,2,2]#行指标\n",
    "col =  [0,1,2,0,1,2,0,1,2]#列指标\n",
    "data = [1,0,1,0,1,1,1,1,0]#在行指标列指标下的数字\n",
    "team = csr_matrix((data,(row,col)),shape=(3,3))\n",
    "print(team)\n",
    "print(team.todense())\n",
    "team.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 11)"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer = WordCounterToVectorTransformer(vocabulary_size=10)\n",
    "X_few_vectors = vocab_transformer.fit_transform(X_few_wordcounts)\n",
    "X_few_vectors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [99, 11,  9,  8,  3,  1,  3,  1,  3,  2,  3],\n",
       "       [67,  0,  1,  2,  3,  4,  1,  2,  0,  1,  0]], dtype=int32)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few_vectors.toarray()   #  每一行代表一个特征（频率最高的单词出现的次数the出现67次）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 第三行第一列中的67表示第三封电子邮件包含64个不属于词汇表的单词。旁边的1表示词汇表中'of'单词在此电子邮件中出现一次。旁边的2表示'and'单词出现两次,'the'没有出现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'the': 1,\n",
       " 'of': 2,\n",
       " 'and': 3,\n",
       " 'to': 4,\n",
       " 'url': 5,\n",
       " 'all': 6,\n",
       " 'in': 7,\n",
       " 'christian': 8,\n",
       " 'on': 9,\n",
       " 'by': 10}"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer.vocabulary_   # 出现频率最高的单词排名"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 我们现在准备训练我们的第一个垃圾邮件分类器！让我们转换整个数据集："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "preprocess_pipeline = Pipeline([\n",
    "    (\"email_to_wordcount\", EmailToWordCounterTransformer()),\n",
    "    (\"wordcount_to_vector\", WordCounterToVectorTransformer()),\n",
    "])\n",
    "\n",
    "X_train_transformed = preprocess_pipeline.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98125, total=   0.0s\n",
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98125, total=   0.0s\n",
      "[CV]  ................................................................\n",
      "[CV] ................................... , score=0.9925, total=   0.0s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.0s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.1s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.985"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42) # 采用逻辑回归分类器\n",
    "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n",
    "score.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 得到分数超过98.5%，可以尝试多个模型，选择最好的模型，并使用交叉验证对它们进行微调。在测试集上得到的精度/召回率："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "精度: 93.94%\n",
      "召回: 97.89%\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "X_test_transformed = preprocess_pipeline.transform(X_test)\n",
    "\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42)\n",
    "log_clf.fit(X_train_transformed, y_train)\n",
    "\n",
    "y_pred = log_clf.predict(X_test_transformed)\n",
    "\n",
    "print(\"精度: {:.2f}%\".format(100 * precision_score(y_test, y_pred)))\n",
    "print(\"召回: {:.2f}%\".format(100 * recall_score(y_test, y_pred)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "1. 加载数据并纵观数据大局\n",
    "2. 获取邮件的组成结构\n",
    "3. 对结构类型进行分析 发现垃圾邮件大多有HTML结构\n",
    "4. 数据清洗，定义email对象中的HTML转换称纯文本方法\n",
    "5. 对数据集拆分成训练集和测试集\n",
    "6. 数据处理转换，对邮件的文本内容进行分词处理，通过nltk进行词干提取，对邮件出现的词汇进行计数统计，对所有邮件统计出了一个词汇表\n",
    "7. 通过词汇表和邮件单词计数统计，将单词计数转化成向量矩阵\n",
    "8. 把数据清洗和数据处理封装成两个转换器\n",
    "9. 通过流水线来自动化处理数据\n",
    "10. 使用逻辑回归线性分类器进行模型训练\n",
    "11. 使用交叉验证进行微调\n",
    "12. 在测试集上得到精度/召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
